Programmer小卫

故不积跬步,无以至千里。不积小流,无以成江海。

win32 SDK窗口 详解

 

///Class  Style    是指窗口本身的 属性            

// CS_NOCLOSE  就是窗口不能被关闭     

//  CS_HREDRAW  CS_VREDRAW  就是在 窗口移动或者 窗口的宽度或者高度改变的时候就会发送 WM_PAINT 消息   

//CS_DBLCLKS  如果class style  不包括 那么 如果用户双击 鼠标 那么不会 发送 鼠标双击消息   

//CS_CLASSDC   这个用于多线程编程 在多个线程对 一个窗体进行操作的时候一次只能有一个线程对窗体进行操作     

//CS_DROPSHADOW   0x00020000  加上这个就会在窗体周围产生一块阴影 。。      

//CS_OWNDC  有设置这个的class创建的窗口都有个独立的 Device Context   特别是作为主窗体的中 应该都要设置它      

 

//Window Styles  是指窗口的外观 

例如 WM_BORDER      有边框    

        WM_CHILD    子窗体 

        WS_CAPTION  创建有标题栏的窗口  

       WS_CHILDWINDOW  设置为子窗体 这样设置就不会显示 菜单栏  Menu Bar  也不能设置  WS_POPUP属性   

      WS_SIZEBOX  WS_THICKFRAME 如果不设置那么窗体不能被改变大小    

   要设置最大化最小化的时候 也要设置 WS_SYSMENU  否则最大化最小化也不会显示 

 

 

 

 

#include <windows.h>
#include <stdio.h>
#include "WINUSER.H"
LRESULT CALLBACK WinProc(   //窗口回调函数的声明
       HWND hwnd,     
       UINT uMsg,     
       WPARAM wParam, 
       LPARAM lParam  
       );
int WINAPI WinMain(  //入口函数
       HINSTANCE hInstance,      // 当前实例的句柄
       HINSTANCE hPrevInstance,  //先前实例的一个句柄
       LPSTR lpCmdLine,          // 命令行
       int nCmdShow              // 显示状态
       )
{
 
 WNDCLASS cls;
 cls.cbClsExtra =0 ;
 cls.cbWndExtra=0 ;
 cls.hbrBackground=(HBRUSH)::GetStockObject(GRAY_BRUSH) ;
 cls.hCursor=::LoadCursor(NULL,IDC_ARROW) ;
 cls.hIcon=LoadIcon(NULL,IDI_ERROR);  
 cls.hInstance=hInstance ;
 cls.lpfnWndProc=WinProc  ;
 cls.lpszClassName="SDK";
 cls.lpszMenuName="NewMenu";
 cls.style=CS_VREDRAW|CS_HREDRAW |CS_DBLCLKS|0x00020000|CS_NOCLOSE;
 ::RegisterClass(&cls) ;
 HWND m_hWnd;
 m_hWnd=::CreateWindow("SDK","New Win32 Application",WS_OVERLAPPEDWINDOW|WS_SYSMENU|WS_MINIMIZEBOX,100,200,600,600,NULL,NULL,hInstance,NULL) ;  //创建窗口返回窗口的句柄
 ::ShowWindow(m_hWnd,SW_SHOWNORMAL) ;   //显示窗口 
 ::UpdateWindow(m_hWnd) ;   //更新窗口  
 MSG msg ;
 while(::GetMessage(&msg,m_hWnd,NULL,NULL))   //从消息队列检索消息
 {
  ::TranslateMessage(&msg) ;  //翻译消息
  ::DispatchMessage(&msg) ;   //分发消息
 }
 
 return 0 ;
}
LRESULT CALLBACK WinProc(
       HWND hwnd,      //   窗体的句柄
       UINT uMsg,      // WM_开头的消息
       WPARAM wParam,  //   第一个附加参数
       LPARAM lParam   //  消息的第二个附加参数 
       )
{
    switch(uMsg)
 {
 case WM_PAINT :
  {
   HDC hdc  ;
   PAINTSTRUCT ps ;   //填充PAINTSTRUCT 结构体 
   hdc=::BeginPaint(hwnd,&ps) ; //BeginPaint() EndPaint()只有在响应WM_PAINT 消息的时候才会被调用 作用是从消息队列删除WM_PAINT 消息 
   //如果此处用GetDC来获取DC那么 就无法从消息队列中取出 WM_PAINT 消息 那么 windows会一直认为这是一个
   //Invalid Area 无效区域  那么就会不停的重绘 导致程序卡死 。
   ::TextOut(hdc,10,10,"Win32_SDK",strlen("Win32_SDK")) ;  
   ::EndPaint(hwnd,&ps);     //在响应WM_PAINT 消息的时候 BeginPaint()后面必须跟上 EndPaint()
   break;    
  }
  
    case WM_LBUTTONDOWN:
  {
   HDC dc ;
   dc=::GetDC(hwnd) ;   //获得窗口的画布   ClientAprea   
   TextOut(dc,10,30,"Left Button Down!",strlen("Left Button Down!")) ; 
   break;
   
  } 
 case WM_LBUTTONDBLCLK :
  {
          MessageBox(hwnd,"","",MB_OK) ;
    break ;
 

  }
 case WM_CLOSE:
  {    if(IDYES==::MessageBox(hwnd,"真的要退出?","提示",MB_YESNO))
   ::DestroyWindow(hwnd) ;    //销毁窗体     销毁窗体的时候会发送一个 WM_DESTROY 消息 我们可以拦截这个消息并且调用PostQuitMessage(0)  
  break ;                   //来退出程序 
  }
 case WM_DESTROY :
  {   ::PostQuitMessage(0);  //正常退出
   break ;
  }
 case WM_RBUTTONDOWN  :
  {
             MessageBox(hwnd,"Right Button Down","提示",MB_OK); 
    break ;
  }
  
 default: return DefWindowProc(hwnd,uMsg,wParam,lParam) ;  //默认调用缺省的窗口过程
  
 }
 return 0 ;
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yue7603835/article/details/6878340
个人分类: C++ MFC API
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭