一个关于随机 ractangles 的 Windows API 程序......我不知道变量如何获得它的值
Posted
技术标签:
【中文标题】一个关于随机 ractangles 的 Windows API 程序......我不知道变量如何获得它的值【英文标题】:A windows API program on random ractangles...I don't know how the variable get its value 【发布时间】:2012-09-26 07:41:46 【问题描述】:<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>
不知道程序顶部的变量clientx和clienty是如何在程序运行时得到它们的值s的...因为我在程序中没有看到任何赋值...我以前调试过它在我的 Visual Studio 2010 中,当它运行到 WinMain() 中的“ShowWindow(hwnd,iCmdShow);”时,clientx 和 clienty 得到了它们的值(735 和 654 随机......)。但在此之前,clientx 和 clienty两者都是“0”。我很困惑~~非常感谢~~~ :)
【问题讨论】:
您是否检查过收到WM_SIZE
消息时会发生什么?看起来像是给我的任务。
【参考方案1】:
我认为您在问为什么clientx
和clienty
在未明确初始化为零时都具有零值。
全局变量,如clientx
和clienty
,具有静态存储持续时间。如果具有静态存储持续时间的变量未显式初始化(来自 C99 标准的 6.7.8 初始化 节):
【讨论】:
【参考方案2】:客户端 x 和客户端 y 初始化为零(如 hmjd 所述),因为它们是全局的。
当应用程序打开时,Windows 会向窗口过程发送 WM_RESIZE 消息,告诉它窗口有多大(如果用户调整窗口大小,则会再次发送此消息)。在底部附近,您可以看到根据 RESIZE 消息的参数设置 clientx 和 clienty 的代码 - 本质上它们是客户端窗口的高度和宽度(以像素为单位)。
【讨论】:
【参考方案3】:这些值来自您之前的会话。当您关闭***窗口时,Windows 会记住它的大小和位置。
http://support.microsoft.com/kb/235994
Windows 将关闭窗口的大小和位置信息保存在 以下注册表位置: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams
Windows 最多可以保存 28 个不同的大小和位置信息 windows. 每个窗口的大小和位置参数都存储在一个 Streams 键的子键。
【讨论】:
以上是关于一个关于随机 ractangles 的 Windows API 程序......我不知道变量如何获得它的值的主要内容,如果未能解决你的问题,请参考以下文章