且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Windows 程序设计3、4章笔记

更新时间:2022-08-13 08:10:25

 

#include "windows.h"
#include "stdio.h"
#include "stdlib.h" 
#include "resource.h"     //预编译我们的资源文件
#include "tchar.h"
LRESULT CALLBACK MyProc(
      HWND hwnd,    
      UINT uMsg,    
      WPARAM wParam, 
      LPARAM lParam  
      );
int WINAPI WinMain(
       HINSTANCE hInstance,    
       HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine,        
       int nCmdShow            
       )
{  HWND  hWnd ;
MSG  msg ;
static TCHAR szAppName[] = TEXT ("NewWindow") ; //窗口类名
WNDCLASS  cls ;
cls.cbClsExtra=0 ;
cls.cbWndExtra=0 ;
cls.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH) ;    
cls.hCursor=LoadCursorFromFile("resource\\xx.ani") ;
cls.hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)) ;
cls.hInstance=hInstance ;
cls.lpfnWndProc=MyProc ;
cls.lpszClassName=szAppName;
cls.lpszMenuName=NULL;
cls.style=CS_HREDRAW|CS_VREDRAW| 0x00020000;   //CS_DROPSHADOW  0x00020000在  vc6 以及以前的版本中没有定义 我们可以自定义 这个窗体有阴影
RegisterClass(&cls) ;
hWnd=CreateWindow("NewWindow","SDK_Window Demo",WS_TABSTOP|WS_HSCROLL|WS_VSCROLL|WS_SYSMENU ,200,200,500,400,NULL,NULL,hInstance,NULL) ;
ShowWindow(hWnd,SW_SHOWNORMAL) ;
UpdateWindow(hWnd) ;  

while(GetMessage(&msg,NULL,0,0))  //获得消息 后面2个参数为0会接受任何 win32消息
{
    TranslateMessage(&msg) ; //翻译消息
    DispatchMessage(&msg) ;//分发消息
}

return  0;

}
LRESULT CALLBACK MyProc(
      HWND hwnd,     
      UINT uMsg,      //win32消息的类型
      WPARAM wParam,   //第一个附加参数
      LPARAM lParam  //第二个附加参数一般是值
      )
{  
 switch (uMsg)
 {
 case WM_PAINT :  //UpdateWindow函数的调用会进入这个消息响应
  {
   HDC dc ;
   PAINTSTRUCT ps ;
   dc=BeginPaint(hwnd,&ps) ;
   SetTextAlign(dc,TA_LEFT|TA_TOP) ; //设置基点的位置 。。也就是坐标(0,0)
   TextOut(dc,60,60,_T("GameWnd"),lstrlen(_T("GameWnd")));//include  TCHAR.H  Head File 
   EndPaint(hwnd,&ps) ;
   return 0 ;
  }
 case WM_CREATE :  //当窗体创建的时候 是 窗口过程接受的第一个消息 
  {
 //  SetWindowLong(hwnd,GWL_STYLE,(GetWindowLCong(hwnd,GWL_STYLE)&~WS_CAPTION));  //SetWindowLong 设置窗体的style
      SetScrollRange(hwnd,SB_HORZ,0,100,FALSE) ;   //SetScrollRange 设置 滚动条的范围 是min-max 
   SetScrollPos(hwnd,SB_HORZ,50,FALSE) ;  // SetScrollPos设置滚动条的位置 是相对与 min-max中的位置   最后一个参数设置为false表示不需要重绘
                                                   //InvalidateRect会使客户区域变为 Invalid Area 从而向消息队列中加入  WM_PAINT 消息但始终合格消息的优先级较低 但是我们可以调用 UpdateWindow立即更新窗口
                                       //也就是 说 在调用了 InvalidateRect 时候接着调用 UpdateWindow 才会立即重绘  
                                               //新的函数 GetScrollInfo 和 GetScrollInfo函数可以完成上述四个函数的功能具体应用 MSDN
                                    
   return  0 ;
  }
 case WM_CHAR :
  {
   if('Q'==(char)wParam)
    if(IDYES==MessageBox(hwnd,_T("是否要退出?"),_T("提示"),MB_YESNO) )
    {
     DestroyWindow(hwnd) ;  //销毁窗体
    }
    return 0 ;
  }
 case WM_DESTROY:
  {   
   PostQuitMessage(0);  //向消息队列中发送一个退出消息
   return 0;
  }
  
 }
 return DefWindowProc(hwnd,uMsg,wParam,lParam) ;  //返回缺省的窗口过程
}