C 一个基于随机角度的windows API程序…我不知道';我不知道变量是如何得到它的值的
我不知道当程序运行时,程序顶部的变量clientx和clienty是如何得到它们的值的…因为我在程序中没有看到任何值赋值…我过去在visual studio 2010中调试它,当它运行到WinMain()中的“ShowWindow(hwnd,iCmdShow);”时,clientx和clienty得到了它们的值(735和654随机…。但在此之前,clientx和clienty都是“0”。我很困惑~~非常感谢~~~:)我想你是在问为什么C 一个基于随机角度的windows API程序…我不知道';我不知道变量是如何得到它的值的,c,windows,multithreading,api,mfc,C,Windows,Multithreading,Api,Mfc,我不知道当程序运行时,程序顶部的变量clientx和clienty是如何得到它们的值的…因为我在程序中没有看到任何值赋值…我过去在visual studio 2010中调试它,当它运行到WinMain()中的“ShowWindow(hwnd,iCmdShow);”时,clientx和clienty得到了它们的值(735和654随机…。但在此之前,clientx和clienty都是“0”。我很困惑~~非常感谢~~~:)我想你是在问为什么clientx和clienty都没有显式初始化为零,但它们的值
clientx
和clienty
都没有显式初始化为零,但它们的值都是零
全局变量,如clientx
和clienty
,具有静态存储持续时间。如果未明确初始化具有静态存储持续时间的变量(根据C99标准第6.7.8节初始化):
- 如果有指针类型,则初始化为空指针李>
- 如果它有算术类型,则初始化为(正或无符号)零强>
- 如果是聚合,则根据这些规则(递归地)初始化每个成员李>
- 如果它是一个联合,那么第一个命名成员将根据以下规则(递归)初始化 规则
当应用程序打开时,Windows会向窗口过程发送一条WM_RESIZE消息,告知窗口有多大(如果用户调整窗口大小,则会再次发送此消息)。在底部附近,您可以看到根据调整大小消息的参数设置clientx和clienty的代码-基本上它们是以像素为单位的客户端窗口的高度和宽度。这些值来自您以前的会话。关闭顶级窗口时,Windows会记住其大小和位置 Windows在中保存已关闭窗口的大小和位置信息 以下注册表位置: HKEY\ U当前\用户\软件\ Microsoft\Windows\CurrentVersion\Explorer\Streams Windows可为多达28种不同的应用程序保存大小和位置信息 窗口。每个窗口的大小和位置参数存储在 Streams键的子键
您是否检查了收到
WM\u SIZE
消息时发生的情况?在我看来,这是一项任务。
<pre>
#include<Windows.h>
#include<process.h>
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
HWND hwnd;
int clientx,clienty;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("hello");
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.hInstance=hInstance;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("this program requires windows NT"),TEXT("wrong"),MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName,TEXT("random rectangles"),
WS_OVERLAPPEDWINDOW,
100,100,800,600,
NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
VOID Thread(PVOID pvoid)
{
HBRUSH hbrush;
HDC hdc;
int xleft,xright,ytop,ybottom,ired,igreen,iblue;
while(TRUE)
{
if(clientx!=0||clienty!=0)
{
xleft=rand()%clientx;
xright=rand()%clientx;
ytop=rand()%clienty;
ybottom=rand()%clienty;
ired=rand()%255;
igreen=rand()%255;
iblue=rand()%255;
hdc=GetDC(hwnd);
hbrush=CreateSolidBrush(RGB(ired,igreen,iblue));
SelectObject(hdc,hbrush);
Rectangle(hdc,min(xleft,xright),min(ytop,ybottom),max(xleft,xright),max(ytop,ybottom));
ReleaseDC(hwnd,hdc);
DeleteObject(hbrush);
}
}//while
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
_beginthread(Thread,0,NULL);
return 0;
case WM_SIZE:
clientx=LOWORD(lParam);
clienty=HIWORD(lParam);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
<code>