Windows窗体程序

来源:互联网 发布:万象网管ol数据库 编辑:程序博客网 时间:2024/05/20 18:44

最近在重新复习Windows的窗体程序,所以现在开始把一个Win窗体程序的基本要素和代码都记录下来:

 

#include <Windows.h>

 

LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM );

 

int WINAPI WinMain(
 
   HINSTANCEhInstance,     //程序实例句柄,用以标识本应用程序
 
   HINSTANCEhPrevInstance,
 
   LPSTRlpCmdLine,
 
   intnCmdShow
)
{
 
TCHAR szAppName[] = TEXT("Win32");
 
HWND hwnd;
 
MSG msg;
 
WNDCLASSEXwndclass;      //WNDCLASSEX比旧的WNDCLASS多了2个新字段

 

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

 //2个新字段

 wndclass.cbSize = sizeof(WNDCLASSEX);
 
wndclass.hIconSm = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));

 

 //注册窗体类,以后根据同一个窗体类创建的窗体基本属性一样

 if(!RegisterClassEx(&wndclass) )
 
{
 
 MessageBox(NULL, TEXT("Can notRegister!"), szAppName, MB_ICONERROR);
 
 return 0;
 
}
 

 //创建窗体
 
if(!(hwnd =CreateWindowEx(NULL,  //高级特性style,详细查msdn
 
         szAppName,              //窗体类字符串
 
         TEXT("Win32Test"),       //窗体标题
 
         WS_OVERLAPPEDWINDOW,     //窗体风格,详细查msdn
 
         CW_USEDEFAULT,CW_USEDEFAULT,//窗体起始位置为默认,也即是窗体左上角的x, y坐标,可自行设定
 
         CW_USEDEFAULT,CW_USEDEFAULT, //窗体宽和高
 
         NULL,NULL,             //窗体父窗口句柄和窗体菜单句柄,这里设为NULL
 
         hInstance, NULL)))    //窗体程序实例hInstance,而保留字段设NULL

          return0;
 
   
 
ShowWindow(hwnd,nCmdShow);      //令窗体可见的,也可以在上面的窗体风格位置添加WS_VISIBLE
 
UpdateWindow(hwnd);              //向窗体发送一个WM_PAINT消息以刷新窗体客户区
 

 
//消息循环,直至接收WM_QUIT退出循环
 
while(GetMessage(&msg, NULL, 0,0))

 {

  TranslateMessage(&msg);         //对从消息队列获取的一条消息进行翻译,处理
 
  DispatchMessage(&msg);          //把消息派发到对应的窗体,然后使用对应的过程函数WndProc(如下)处理

 }


 
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
 
 switch(message)
 
{

  case WM_CLOSE:
 
 {

   //这里使用一个弹出窗体来提示用户是否退出本窗体程序,点击“是”就向窗体发送WM_DESTROY消息来关闭程序,否则退出本函数(不作任何处理,注意:这里直接跳过了DefWindowProc的处理,避免该默认过程向窗体发送关闭消息)
 
  if(IDYES ==MessageBox(hwnd, TEXT("退出程序吗?"), NULL, MB_YESNO | MB_ICONQUESTION))
 
  {
 
   SendMessage(hwnd,WM_DESTROY, NULL, NULL);
 
  }
 
  return 0;//处理完毕函数退出
 
 }break;

 case WM_DESTROY:
 
 {
 
  PostQuitMessage(0);//向窗体发送WM_QUIT
 
  return0;
 
 }
 
 break;
 
}
 
return DefWindowProc(hwnd, message, wParam,lParam );
}

PS:TEXT()是一个对ASCII和UNICODE字符编码支持的宏,如果编译环境是设定为UNICODE的话会自动采用UNICODE编码,否则就是ASCII,简而言之,就是使用该宏可以根据需求来支持两种编码。TEXT宏等价于_T、T宏。

 

0 0
原创粉丝点击