码迷,mamicode.com
首页 > Windows程序 > 详细

win32窗口程序的过程

时间:2014-08-05 22:04:20      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   使用   os   io   文件   

复习一下win32窗口程序

设计一个窗口类;
注册窗口类;
创建窗口;
显示及更新窗口。
消息循环,去获取消息;
窗口过程函数的消息响应。

设计窗口类:

typedef struct _WNDCLASS 
{
UINT        style; //窗口类的类型
WNDPROC    lpfnWndProc; //窗口过程函数(回调函数)  
 int         cbClsExtra; //为该类设定额外内存空间  
 int         cbWndExtra; //为该窗口设定额外内存空间   
HANDLE     hInstance; //当前应用程序的实例号   
ICON       hIcon; //图标,一般用LoadICON函数赋值   
HCURSOR     hCursor; //光标,一般用LoadCursor函数赋值   
HBRUSH      hbrBackground; //窗口背景GetStockObject()   
LPCTSTR     lpszMenuName; //设置菜单名(常量字符串)   
LPCTSTR     lpszClassName; // 设计一个窗口类的名字
} WNDCLASS;

窗口类的类型:

在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以我们经常根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位(bit)为1,其余的bit都为0。我们使用goto definition就能发现CS_VREDRAW=0x0001,CS_HREDRAW=0x0002,CS_DBLCLKS =0x0008,CS_NOCLOSE=0x0200。他们的共同点就是只有一位为1,其余位都为0。如果我们希望某一变量的数值既有CS_VREDRAW特性,又有CS_HREDRAW特性,我们只需使用二进制OR(|)操作符将他们进行或运算相组合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我们希望在某一变量原有的几个特征上去掉其中一个特征,用取反(~)之后再进行与(&)运算,就能够实现,如在刚才的style的基础上去掉CS_NOCLOSE特征,可以用style & ~CS_NOCLOSE实现。

窗口过程函数:

第二个成员变量lpfnWndProc指定了这一类型窗口的过程函数,也称回调函数。回调函数的原理是这样的,当应用程序收到给某一窗口的消息时(还记得前面讲过的消息通常与窗口相关的吗?),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。

注册窗口类:

RegisterClass(&wndclass);

创建窗口:

HWND CreateWindow(
    LPCTSTR lpClassName, // pointer to registered class name 
    LPCTSTR lpWindowName, // pointer to window name 
    DWORD dwStyle, // window style 
    int x, // horizontal position of window 
    int y, // vertical position of window 
    int nWidth, // window width 
    int nHeight, // window height 
    HWND hWndParent, // handle to parent or owner window 
    HMENU hMenu, // handle to menu or child-window identifier 
    HANDLE hInstance, // handle to application instance 
    LPVOID lpParam // pointer to window-creation data 
);

显示及更新窗口:

The ShowWindow function sets the specified windows show state. 
BOOL ShowWindow(     
HWND hWnd, // handle to window     
int nCmdShow // show state of window ); 
BOOL UpdateWindow(             
HWND hWnd // handle of window );

消息循环(获取消息):

BOOL GetMessage(        
LPMSG lpMsg, // address of structure with message       
HWND hWnd, // handle of window        
UINT wMsgFilterMin, // first message        
UINT wMsgFilterMax // last message );
MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

窗口过程函数(回调函数):

LRESULT CALLBACK WinSunProc(  
HWND hwnd,      // handle to window  
UINT uMsg,      // message identifier  
WPARAM wParam,  // first message parameter 
LPARAM lParam   // second message parameter)
{    
switch(uMsg)    
{    
case WM_LBUTTONDOWN:        
break;    
case WM_CLOSE:        
break;    default:        
return DefWindowProc(hwnd,uMsg,wParam,lParam);    
}    
return 0;
}
//孙鑫视频案例代码参考
//运行环境Visual C++ :新建 Win32 Application(注意类型) 工程 ,再新建WinMain.cpp C++源文件)
//win32窗口程序

#include <windows.h>
#include <stdio.h>

//窗口过程函数声明
LRESULT CALLBACK WinKevinProc(
       HWND hwnd,
       UINT uMsg,
       WPARAM wParam,
       LPARAM lParam
       );

int WINAPI WinMain(
       HINSTANCE hInstance,
       HINSTANCE hPrevInstance,
       LPSTR   lpCmdLine,
       int nCmdShow
       )
{
 //设计一个窗口类
 WNDCLASS wndcls;
 wndcls.cbClsExtra = 0;
 wndcls.cbWndExtra = 0;
 wndcls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
 wndcls.hIcon = LoadIcon (NULL,IDI_ERROR);
 wndcls.hCursor = LoadCursor (NULL,IDC_CROSS);
 wndcls.hInstance = hInstance;
 wndcls.lpfnWndProc = WinKevinProc;   //回调函数
 wndcls.lpszClassName = "zcx";
 wndcls.style = CS_HREDRAW | CS_VREDRAW;
 wndcls.lpszMenuName = NULL;

 //注册窗口类
 RegisterClass(&wndcls);

 //创建窗口,保存窗口句柄
 HWND hwnd;
 hwnd = CreateWindow ("zcx","**大学", 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);
 }//endof while
 return 0;

} //endof winMain()

//编写窗口过程函数
LRESULT CALLBACK WinKevinProc(
       HWND hwnd,
       UINT uMsg,
       WPARAM wParam,
       LPARAM lParam
       )
{
 switch(uMsg)
 {
 case WM_CHAR:
  char szChar[20];
  sprintf (szChar , "char is %d",wParam);
  MessageBox(hwnd,szChar,"zcx",0);
  break;
 case WM_LBUTTONDOWN:
  MessageBox(hwnd,"mouse clicked","zcx",0);
  HDC hdc;
  hdc = GetDC(hwnd);              //不能在响应WM_PAINT消息时调用
  TextOut (hdc,0,50,"**大学",strlen("**大学"));
  ReleaseDC (hwnd,hdc);
  break;
 case WM_PAINT:
  HDC hDC;
  PAINTSTRUCT ps;
  hDC = BeginPaint(hwnd,&ps);          //只能在响应WM_PAINT消息时调用
  TextOut(hDC,0, 0, "zcx",strlen("zcx"));
  EndPaint(hwnd,&ps);
  break;
 case WM_CLOSE:
  if(IDYES == MessageBox(hwnd,"是否真的退出程序?","弹窗提示",MB_YESNO))
  {
   DestroyWindow(hwnd);
  }//ENDOF IF
  break;
 case WM_DESTROY:
  PostQuitMessage(0);

  break;
 default:
  return DefWindowProc(hwnd,uMsg, wParam, lParam);
 }//endof swith()

 return 0;
}//end of WinSunProc()

win32窗口程序的过程,布布扣,bubuko.com

win32窗口程序的过程

标签:des   style   blog   color   使用   os   io   文件   

原文地址:http://www.cnblogs.com/tianya2543/p/3892995.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!