[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);
}
……
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;
}
=========================================================================
以上就是我所握的关于窗口私有变量的方法,能使各个窗口之间不互相影响,希望能对你有所帮助!*^_^*