注册 登录
编程论坛 VC.NET论坛

调用api函数做了一个图形界面,可是打开exe文件后没有反应啊,但进程中的确打开了

教皇 发布于 2012-05-20 22:47, 1524 次点击
#include<windows.h>
#include<stdio.h>

LRESULT CALLBACK WinXrProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

int WINAPI WinMain(  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow   )           // show state)
{
 WNDCLASS wnd;
 wnd.cbClsExtra=0;
 wnd.cbWndExtra=0;
 wnd.hbrBackground=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
 wnd.hCursor=LoadCursor(NULL,IDC_CROSS);
 wnd.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 wnd.hInstance=hInstance;
 wnd.lpfnWndProc=WinXrProc;
 wnd.lpszClassName="XiangRong";
 wnd.lpszMenuName=NULL;
 wnd.style=CS_HREDRAW|CS_VREDRAW;
 
 RegisterClass(&wnd);
 HWND hwnd;
 hwnd=CreateWindow("XiangRong","第一个程序",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);

 ShowWindow(hwnd,SW_SHOWNORMAL);
 UpdateWindow(hwnd);
 MSG msg;
 while(GetMessage(&msg,NULL,0,0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 return 0;
}

LRESULT CALLBACK WinXrProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam)   // second message parameter


{

 HDC Hdc;
 PAINTSTRUCT ps;
 switch(uMsg)
 {
   case WM_CHAR:
     char sz[20];
     sprintf(sz,"char is %d",wParam);
     MessageBox(hwnd,sz,"提示",MB_OK);
     break;
   case WM_LBUTTONDOWN:
     MessageBox(hwnd,"mouse is clicked","提示",0);
     HDC HDc;
     HDc=GetDC(hwnd);
     TextOut(HDc,0,50,"简单的窗口建立",strlen("简单的窗口建立"));
     ReleaseDC(hwnd,HDc);
     break;
   case WM_PAINT:
   
     Hdc=BeginPaint(hwnd,&ps);
     TextOut(Hdc,0,100,"真他妈的难",strlen("真他妈的难"));
     EndPaint(hwnd,&ps);
     break;
   case WM_CLOSE:
     if(IDYES==MessageBox(hwnd,"是否真的要退出","提示",MB_YESNO))
     {
      DestroyWindow(hwnd);
     }
     break;
   case WM_DESTROY:
     PostQuitMessage(0);
     break;
   default:DefWindowProc(hwnd,uMsg,wParam,lParam);
 
 }
 return 0;
}
3 回复
#2
qq4929276892012-07-24 08:54
你在CreateWindow后面加一句
#3
qq4929276892012-07-24 08:55
发错了,你在CreateWindow加一句
if(!hwnd)
{
    MessageBox(NULL,TEXT("窗口创建失败了"),TEXT("提示:"),MB_OK);
}

再运行一下就知道了,但是……

你丫的,你怎么搞出这么一个程序的,哥找了半天也找不到创建失败的原因!!!


#4
qq4929276892012-07-24 09:18
找到了,问题出在这一句  【default:DefWindowProc(hwnd,uMsg,wParam,lParam);】
不可以这样写的,因为DefWindowProc是需要作一次返回,告诉系统该程序发生了什么事,系统根据它的返回值判断是否成功才执行下一步的响应。
所以DefWindowsProc必须作一个返回,改成【default:  return DefWindowProc(hwnd,uMsg,wParam,lParam);】

1