首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

[win32]多个窗口其间怎样定义各自的变量互不影响

2012-12-15 
[win32]多个窗口之间怎样定义各自的变量互不影响?我在做一款能够显示和操作图像的软件软件里面可以创建多

[win32]多个窗口之间怎样定义各自的变量互不影响?
我在做一款能够显示和操作图像的软件
软件里面可以创建多个窗口,每个窗口可以以不同的方式查看同一幅图片,
于是我用
HWND hwndimg[20]   // 假设最大不超过20个窗口
这种方式创建了这些窗口,
然后给他们分别加上了同一个WndProc
于是问题来了:
我在WndProc函数中,定义了一些变量来确定图像显示的位置,比例等属性
比如:
static int xLoc, yLoc; // 等等诸如此类的变量
由于是static类型的,所以一个窗口的操作就同时影响了其他窗口
如果我不定义成static类型的,每次又都会被重置。。。
请问我该怎么办?
下面是我程序的大致结构

int WinMain(...)
{
HWND hwndmain;     // 主窗口
HWND hwndimg[20];  // 暂定最多20个窗口
MSG msg;
WNDCLASS wndclass
/* ...窗口初始化代码...  */
wndclass.lpfnWndProc = ImgWndProc;
hwnd[0] = CreateWindow(......) // 一开始先创建一个窗口
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
return msg.wParam;
}

// 下面是回调函数
LRESULT CALLBACK ImgWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int xLoc, yLoc; // 一些变量初始化
    // 还有很多类似变量

    switch(message)
    {
    case WM_CREATE:
        // ...一些代码

    case WM_PAINT:
        // ...一些代码

    case WM_DESTROY:
        DestroyWindow(hwnd);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

[最优解释]
用SetWindowLong 和GetWindowLong吧,可以把数据存到cbWindowExtra里面,具体用法你百度一下就好
如果是64位 用SetWindowLongPtr和GetWindowLongPtr
[其他解释]
由于你这些变量在同一个函数体里面,就是说,不管谁调用的都是这个函数,使用的也都是这几个变量,相互影响是必然的。你只能把这些变量定义成全局变量,或者说是全局的结构体,里面要包含这些变量成员,还要有个区分每个窗体的成员,这样在这个函数里面加以区分使用。
[其他解释]
先感谢2L回答,
我有个地方想问一下,因为我的程序有一个主窗口提供各种操作功能的按钮之类,然后操作其他显示图像的窗口,我之前看见过有创建子窗口的方法,但那个子窗口是在父窗口里面的而我想要分离式的所以没有用而是直接创建了几个窗口。
按照你说的要有个区分几个窗体的成员,我能不能在我的主窗口里面建立这样一个成员并加以控制?
另外也问一下,我能不能创建分离式的子窗口,即类似photoshop那样,周围一圈是工具栏,中间是显示图像的窗口,这样的界面?

[其他解释]
可以在主窗体里面建立一个这样的成员,加以区分控制各个子窗体。也完全可以创建分离式的子窗体
[其他解释]
再有,我是根据你上面的代码说的你可以那样处理。我觉得你是不是也可以把这个显示的窗体单独的设计成一个类,每个类有自己的成员变量,这样每个变量就不相互影响,而且控制起来可能还要方便简单些,具体怎么实现你自己权衡看看。
[其他解释]
我也想到过用类的方法,可是我刚接触win32 api, 只会用hwnd句柄创建窗口。。。能不能教我一下怎么写窗口类呀?
[其他解释]
这样
struct TMyWin
{
    int xLoc;
    int yLoc;

     HWND hwndimg;
};

TMyWin hwnds[20];
//hwnd[0] = CreateWindow(......) // 一开始先创建一个窗口
   hwnds[0].hwndimg = CreateWindow(......) // 一开始先创建一个窗口

[其他解释]
楼上的方法不行啊。。。我要在wndproc里面调用xLoc这些变量的。。。
[其他解释]
我有切实可行的办法:
在注册窗口类的时候,WNDCLASSEX结构体中有一个叫做cbWndExtra的成员,它的意思就是,需要为每个窗口额外安排的内存空间,单位为字节。我们通过SetWindowLong()函数来给这些字节赋值,通过GetWindowLong()函数来查看这些字节的值。举例,假设我们需要3个int变量(12字节):


……
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
……
wincl.cbWndExtra = 12;//3个int型,12个字节
if (!RegisterClassEx (&wincl))
return false;
……
LRESULT CALLBACK WinProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int a,b,c;
switch (message)
{
case WM_SIZE: 
a=GetWindowLong(hwnd,0);//取得第一个int,a为0
a=GetWindowLong(hwnd,4);//取得第一个int,b为1
a=GetWindowLong(hwnd,8);//取得第一个int,c为2
break;
        case WM_CREATE:
SetWindowLong(hwnd,0,0);//设置第一个int为0
SetWindowLong(hwnd,4,1);//设置第二个int为1
SetWindowLong(hwnd,8,2);//设置第三个int为2
break; 
case WM_DESTROY:
            PostMessage(GetParent(hwnd),LAND_OVER,0,0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}
==============================================================================================
以上是当变量少时,我们可以这样直接用,当变量多时,这样用就显得麻烦了,所以我们可以用malloc()函数来申请内存来储存变量,用cbWndExtra来储存这块内存的指针,不用时再用free()函数释放。举例,我们提前定义一个变量结构体:
typedef struct {
inta;
intb;
…………
intm;
}BM;
……
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
……
wincl.cbWndExtra = 4;//4个字节,用来储存变量内存块的指针
if (!RegisterClassEx (&wincl))
return false;
……
LRESULT CALLBACK WinProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
BM * pBM;//定义一个BM结构体指针
switch (message)
{
        case WM_CREATE:
pBM=malloc(sizeof(BM));//申请BM这么大的内存,指针储存在pBM里
SetWindowLong(hwnd,0,(long)pBM);//将这个指针储存在窗口额外空间里
break; 
case WM_SIZE: 
pBM=(BM*)GetWindowLong(hwnd,0);//取得这个指针,放在pBM里
pBM->a=0;//对变量进行赋值,或取得变量的值等……
pBM->b=1;
…………
break;
case WM_DESTROY:
pBM=(BM*)GetWindowLong(hwnd,0);//取得这个指针,放在pBM里
free(pBM);//当不使用变量了,要释放掉之间申请的内存!
PostQuitMessage(0);
break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}
=========================================================================
以上就是我所握的关于窗口私有变量的方法,能使各个窗口之间不互相影响,希望能对你有所帮助!*^_^*

热点排行