我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: [求助]关于Win32编程的一个问题 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

albert





性别: 保密 状态: 该用户目前不在线
等级: 栋梁之材
家族: 唯war独尊
发贴: 634
威望: 0
浮云: 1116
在线等级:
注册时间: 2005-10-04
最后登陆: 2012-02-12

5come5帮你背单词 [ region /'ri:d3ən/ n. 地区,区域,领域,范围 ]


[求助]关于Win32编程的一个问题

#include <windows.h>    

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(   HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int   nCmdShow)    
{
  MSG     msg;
  WNDCLASS   wc;
  HWND hWnd;

  wc.style         = CS_HREDRAW | CS_VREDRAW;  
  wc.lpfnWndProc     = (WNDPROC) WndProc;          
  wc.cbClsExtra     = 0;                        
  wc.cbWndExtra     = 0;                        
  wc.hInstance     = hInstance;                  
  wc.hIcon         = LoadIcon(NULL, IDI_WINLOGO);        
  wc.hCursor         = LoadCursor(NULL, IDC_ARROW);    
  wc.hbrBackground   = (HBRUSH)GetStockObject(BLACK_BRUSH);                        
  wc.lpszMenuName     = NULL;                    
  wc.lpszClassName   = "Demo";    

  if (!RegisterClass(&wc))                        
  {
    MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;                          
  }
  hWnd=CreateWindow(
                    "Demo",                
                    "Demo1",                                        
                    WS_OVERLAPPEDWINDOW,          
                    CW_USEDEFAULT,
                    CW_USEDEFAULT,                    
                    CW_USEDEFAULT,  
                    CW_USEDEFAULT,  
                    NULL,                  
                    NULL,                    
                    hInstance,            
                    NULL    
    );
  ShowWindow(hWnd,nCmdShow);
  UpdateWindow(hWnd);

  //这里为什么改成GetMessage(&msg,hWnd,0,0)程序就关不了了?    
  while(GetMessage(&msg,NULL,0,0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }

  return (msg.wParam);                  
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)        
{
  switch (uMsg)                        
  {
    case WM_CLOSE:
        PostQuitMessage(0);          
        return 0;

    default:
        break;
  }

  return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

如果将GetMessage中的第2个NULL参数改成和hWnd程序就关不了了,我查过MSDN上边讲当第2个参数是NULL时,表示为属于该程序的消息队列的所有窗口检索信息。但问题是,我这个程序里就只有一个窗口,用该窗口的句柄作为参数应该也可以吧。
望高手指点一二。
顶端 Posted: 2006-11-13 21:12 | [楼 主]
海兰



性别: 帅哥 状态: 该用户目前不在线
头衔: 再见了,我的大学
等级: 荣誉会员
家族: 低调一族
发贴: 9006
威望: 3
浮云: 406
在线等级:
注册时间: 2005-10-02
最后登陆: 2013-04-28

5come5帮你背单词 [ leadership /'li:dəip/ n. 领导 ]


LZ这个程序,我执行试了试,如果运行完后窗口不动,直接关就关不掉,但是只要稍微拖动下窗口,让它UPDATE重画一次就可以关掉了...具体原因不清楚,我猜想是hWnd必须在进入了第1次消息循环后才获得当前窗口句柄.在此之前是个随机值吧.所以要UPDATE一下,发送一个PAINT消息让hWnd指向当前窗口.
顶端 Posted: 2006-11-13 22:32 | [1 楼]
stam0



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
发贴: 2704
威望: 0
浮云: 1440
在线等级:
注册时间: 2005-11-22
最后登陆: 2012-12-29

5come5帮你背单词 [ coach /kəut/ n. 教练,(火车)客车车厢,长途公共汽车;训练,辅导,指导 ]


我也运行了一下,确实是像楼主说的情况,LS说的有一定的道理的。
顶端 Posted: 2006-11-13 22:41 | [2 楼]
albert





性别: 保密 状态: 该用户目前不在线
等级: 栋梁之材
家族: 唯war独尊
发贴: 634
威望: 0
浮云: 1116
在线等级:
注册时间: 2005-10-04
最后登陆: 2012-02-12

5come5帮你背单词 [ epic /'epik/ n. 史诗,叙事诗;a. 史诗般的,英雄的,壮丽的 ]


但问题是hWnd在我创建窗体的时候应该就已经得到具体的值了呀。
顶端 Posted: 2006-11-14 09:21 | [3 楼]
only.rainbow



性别: 帅哥 状态: 该用户目前不在线
头衔: 终于有了新的梦想:四手联弹
等级: 人见人爱
发贴: 3353
威望: 4
浮云: 1201
在线等级:
注册时间: 2005-09-22
最后登陆: 2010-12-27

5come5帮你背单词 [ comparative /kəm'pærətiv/ a. 比较的,比较而言的,相当的 ]


楼主喊我顶的
不关我的事
顶端 Posted: 2006-11-14 12:58 | [4 楼]
电子青蛙



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 单身贵族
发贴: 2924
威望: 0
浮云: 1197
在线等级:
注册时间: 2005-09-22
最后登陆: 2008-06-28

5come5帮你背单词 [ jeans /d3əeinz/ n. 工装裤,牛仔裤 ]


GetMessage() will return -1 if it encounters an error. Make sure you remember this, or it will catch you out at some point... even though GetMessage() is defined as returning a BOOL, it can return values other than TRUE or FALSE, since BOOL is defined as UINT (unsigned int). The examples of code like this while(GetMessage(&msg, NULL, 0, 0)) may seem to work, but will not process certian conditions correctly. So the correct way of doing this is while(GetMessage(&msg, NULL, 0, 0)>0), it will work perfectly well
顶端 Posted: 2006-11-15 19:55 | [5 楼]
电子青蛙



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 单身贵族
发贴: 2924
威望: 0
浮云: 1197
在线等级:
注册时间: 2005-09-22
最后登陆: 2008-06-28

5come5帮你背单词 [ lag /læg/ n. 落后,滞后;vi. 落后,走得慢 ]


Your problem is while you click button close, it will send a message WM_CLOSE to the message queue and then WM_DESTROY will also be post, what will actually destory the window is message WM_DESTORY, so it will not work while you click the close button with out handling the message WM_DESTORY. You should write like this:
switch (uMsg)
{
  case WM_CLOSE:
    DestroyWindow(hwnd);
    break;
  case WM_DESTORY:
    PostQuitMessage(0);
    return (0);   //this is not essential
  default:
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

Remark: PostQuitMessage() is designed for message WM_DESTORY; while handling message WM_CLOSE you should use DestroyWindow() and do something else to free the memory, but windows XP has its own garbage collector.
To get rid of these complex message loop, you can use message analyser. in this way you need to "#include <windowx.h>"


[ 此贴被电子青蛙在2006-11-16 10:49重新编辑 ]
顶端 Posted: 2006-11-15 20:09 | [6 楼]
albert





性别: 保密 状态: 该用户目前不在线
等级: 栋梁之材
家族: 唯war独尊
发贴: 634
威望: 0
浮云: 1116
在线等级:
注册时间: 2005-10-04
最后登陆: 2012-02-12

5come5帮你背单词 [ radius /'reidjəs/ (radiuses)范围;半径 n. 半径,辐射光线,界限,范围 ]


OK了,把GetMessage(...)改成GetMessage(...)>0就可以了
顶端 Posted: 2006-11-16 12:29 | [7 楼]
我来我网·5come5 Forum » 程序员之家

Total 0.008601(s) query 5, Time now is:11-27 17:06, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号