Win32学习笔记——win32主框架

来源:互联网 发布:如何看财务报表 知乎 编辑:程序博客网 时间:2024/05/16 07:41

win32主框架:
     定义窗口类(RegisterClass(…))——>初始化窗口(CreateWindow(…))——>消息循环
注意:在执行CreateWindow(…)和消息循环中都会隐式调用窗口进程WndProc(…),
      所以WndProc(…)书写不正确,也会引起CreateWindow(…)失败
#include <windows.h>
#include <stdlib.h>
#include <string.h>

HWND hWnd;
char lpszClassName[]="窗口类";
char lpszTitle[]="窗口";
//窗口进程声明
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);

//定义窗口类
BOOL InitWindowsClass(HINSTANCE hInstance);

//初始化窗口
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
 
//主函数
int WINAPI WinMain(HINSTANCE hInstance,
 HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
 MSG Message;
 if(!InitWindowsClass(hInstance)) return FALSE;
 if(!InitWindows(hInstance,nCmdShow)) return FALSE;
 while(GetMessage(&Message,0,0,0)) //消息循环
 {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return Message.wParam;
}

long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
 switch(iMessage) //处理消息
 {
 case WM_DESTROY: //结束应用程序 
  PostQuitMessage(0);
  break;
 default://其他消息处理程序
  return (DefWindowProc(hWnd,iMessage,wParam,lParam)) ;
 }
 return 0;
}
 
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) //初始化窗口
{
 hWnd=CreateWindow(lpszClassName, //生成窗口
 lpszTitle,
 WS_OVERLAPPEDWINDOW,
 CW_USEDEFAULT,
 0,
 CW_USEDEFAULT,
 0,
 NULL,
 NULL,
 hInstance,
 NULL);
 if(!hWnd)
  return FALSE;
 ShowWindow(hWnd,nCmdShow); //显示窗口
 UpdateWindow(hWnd);
 return TRUE;
}

BOOL InitWindowsClass(HINSTANCE hInstance) //定义窗口类
{
 WNDCLASS WndClass;
 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,"END");
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=lpszClassName;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 return RegisterClass(&WndClass);
}  

 

//------------------------------------------------------------------------------------------------------------------------------------------------

//win32主框架_带菜单

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include "resource.h"

HWND hWnd;
HACCEL hAccel;
char lpszMenuName[]="Menu";
char lpszAccelName[]="Accel";
char lpszClassName[]="菜单"; 
char lpszTitle[]="My_Menu_Example";

//窗口进程声明
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);
 
//定义窗口类
BOOL InitWindowsClass(HINSTANCE hInstance);

//初始化窗口
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
 
//主函数
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
 MSG Message;
 if(!InitWindowsClass(hInstance)) return FALSE;
 if(!InitWindows(hInstance,nCmdShow)) return FALSE;
 hAccel=LoadAccelerators(hInstance,lpszAccelName);
 while(GetMessage(&Message,0,0,0)) //消息循环
 {
  if (!TranslateAccelerator(hWnd,hAccel,&Message))
  {
   TranslateMessage(&Message);
   DispatchMessage(&Message);
  }
 }
 return Message.wParam;
}

long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
 switch(iMessage) //处理消息
 {
 case WM_DESTROY: //结束应用程序
  PostQuitMessage(0);
  break;
 default://其他消息处理程序
  return (DefWindowProc(hWnd,iMessage,wParam,lParam)) ;
 }
 return 0;
}
 
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) //初始化窗口
{
 hWnd=CreateWindow(lpszClassName, //生成窗口
 lpszTitle,
 WS_OVERLAPPEDWINDOW,
 CW_USEDEFAULT,
 0,
 CW_USEDEFAULT,
 0,
 NULL,
 NULL,
 hInstance,
 NULL);
 if(!hWnd)
  return FALSE;
 ShowWindow(hWnd,nCmdShow); //显示窗口
 UpdateWindow(hWnd);
 return TRUE;
}

BOOL InitWindowsClass(HINSTANCE hInstance) //定义窗口类
{
 WNDCLASS WndClass;
 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,"END");
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=lpszClassName;
 WndClass.lpszMenuName=lpszMenuName;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 return RegisterClass(&WndClass);
}