回 帖 发 新 帖 刷新版面

主题:第一个HelloWin程序中的疑问!

#include<windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    static TCHAR szAppName[]=TEXT("myFWin");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;

    wndclass.style=CS_HREDRAW|CS_VREDRAW;
    wndclass.lpfnWndProc=WndProc;
    wndclass.lpszClassName=szAppName;
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndclass.hInstance=hInstance;
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.lpszMenuName=NULL;

    if(!RegisterClass(&wndclass))
    {
        MessageBox(NULL,TEXT("This program requires Windows XP!"),szAppName,MB_ICONERROR);
        return 0;
    }
    hwnd=CreateWindow(szAppName,
                      TEXT("myFirst Window Work"),
                      WS_OVERLAPPEDWINDOW,
                      CW_USEDEFAULT,
                      CW_USEDEFAULT,
                      CW_USEDEFAULT,
                      CW_USEDEFAULT,
                      NULL,
                      NULL,
                      hInstance,
                      NULL);

    ShowWindow(hwnd,nShowCmd);
    UpdateWindow(hwnd);

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;

    switch(message)
    {
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        GetClientRect(hwnd,&rect);

        DrawText(hdc,TEXT("This is my first Windows Work!"),-1,&rect,
            DT_SINGLELINE|DT_CENTER|DT_VCENTER);
        EndPaint(hwnd,&ps);
        return 0;
        
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
}

这个windows程序设计中的那个HelloWin程序,里面有几个地方不明白.

1.HWND hwnd;这个,在整个过程中不用赋值吗?不像C/C++那样需要赋值?

2.MSG msg;这个msg所得到的是什么值?是不是用户对窗口进行操作msg就接收这个操作返回的值啊?

3.DefWindowProc(hwnd,message,wParam,lParam);
这里面的message参数值从哪里得到,而且它是UINT类型,wParam,lParam这两个呢?
如果能解答就麻烦帮忙解答一下,先谢谢了!

回复列表 (共4个回复)

沙发

系统句柄无需手动赋值

板凳

一:hwnd被赋值了啊
hwnd=CreateWindow(szAppName,.......);
二:msg是MSG类型
typedef struct tagMSG { 
  HWND hwnd; 
  UINT message; 
  WPARAM wParam; 
  LPARAM lParam; 
  DWORD time; 
  POINT pt; 
} MSG; 
hwnd 
处理消息过程的窗口句柄 
message 
具体的消息 
wParam 
消息的附加信息(具体的值视message而定)
lParam 
消息的附加信息(具体的值视message而定)
time 
提交消息的时间
pt 
提交消息时,光标所在的位置
三:相关解释和第二处相同

3 楼

WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

4 楼

1、hwnd是窗口句柄,在调用CreatWindow函数时,函数返回新建窗口的句柄。
2、关于MSG这个结构,可以参考《Windows程序设计》(第五版)第54页3.1.7的解释,上面说的很详细。
3、DefWindowProc和你前面看到的WndProc在参数上是一样的,他对WndProc不处理的消息提供默认的处理,这里的message和WndProc的message一样都是消息循环中的消息。程序传给他们的是消息的指针,所以是UINT型,至于wParam和lParam那就和具体的消息有关了,不同的消息,这2个的意义也不同。

我来回复

您尚未登录,请登录后再回复。点此登录或注册