Windows學習筆記——HELLOWIN和SYSMETS

第一個窗口程序(HELLOWIN.cpp),和第一個系統度量程序(SYSMETS1.cpp).

代碼註釋,如下:

  1. //HELLOWIN.cpp  
  2. #include <windows.h>  
  3.  
  4. /* #define CALLBACK _stdcall  
  5.    typedef LONG     LRESULT;  
  6.    */ 
  7.  
  8. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);  
  9.  
  10. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,  
  11.                    LPSTR lpCmdLine,int nShowCmd)  
  12. {  
  13.     HWND hWnd;  
  14.     MSG msg;  
  15.     WNDCLASS wndclass;  
  16.  
  17.     static TCHAR szAppName[]=TEXT("HelloWin"); //static?  
  18.  
  19.     //初始化窗口類的屬性  
  20.     wndclass.cbClsExtra=0;  
  21.     wndclass.cbWndExtra=0;  
  22.  
  23.     wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //wndclass結構體的成員hbrBackground,類型是HBRUSH  
  24.     wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);   
  25.     wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //第一個參數爲什麼爲NULL?表示第二個參數加載的是系統默認圖標ID.  
  26.  
  27.     wndclass.hInstance=hInstance;  
  28.     wndclass.lpfnWndProc=WndProc;  
  29.  
  30.     wndclass.lpszClassName=szAppName;  
  31.     wndclass.lpszMenuName=NULL;  
  32.     wndclass.style=CS_HREDRAW | CS_VREDRAW;  
  33.  
  34.     //註冊窗口類  
  35.     if(!RegisterClass(&wndclass))  
  36.     {  
  37.         MessageBox(NULL,TEXT("This pragram requiers Windows NT."),  
  38.                    szAppName,MB_ICONERROR);  
  39.         return 0;  
  40.     }  
  41.  
  42.     //創建窗口  
  43.     hWnd=CreateWindow(szAppName,TEXT("The Hello Pragram"),WS_OVERLAPPEDWINDOW,  
  44.                       CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,  
  45.                       NULL,NULL,hInstance,NULL);  
  46.  
  47.     ShowWindow(hWnd,nShowCmd); //第二個參數:nShowCmd與iCmdShow?除了名字,一樣的.  
  48.     UpdateWindow(hWnd);   
  49.  
  50.     //循環獲取消息  
  51.     while(GetMessage(&msg,NULL,0,0))  
  52.     {  
  53.         TranslateMessage(&msg);  
  54.         DispatchMessage(&msg);  
  55.     }  
  56.  
  57.     return msg.wParam;  
  58. }  
  59.  
  60. LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)  
  61. {  
  62.     HDC hdc;  
  63.     PAINTSTRUCT ps;  
  64.     RECT rect;  
  65.  
  66.     switch(message)  
  67.     {  
  68.     case WM_CREATE:  
  69.         PlaySound(TEXT("hellowin.wav"),NULL,SND_FILENAME | SND_ASYNC);  
  70.         return 0;  
  71.     case WM_PAINT:  
  72.         hdc=BeginPaint(hWnd,&ps);  
  73.  
  74.         GetClientRect(hWnd,&rect);  
  75.         DrawText(hdc,TEXT("Hello,Windows 98!"),-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);  
  76.  
  77.         EndPaint(hWnd,&ps);  
  78.         return 0;  
  79.     case WM_DESTROY:  
  80.         PostQuitMessage(0); //參數爲什麼爲0?把0傳給msg.wParam.  
  81.         return 0;  
  82.     }  
  83.  
  84.     return DefWindowProc(hWnd,message,wParam,lParam);  
  1. //SYSMETS1.cpp  
  2. #include <windows.h>  
  3. #include "SYSMETS.H"  
  4.  
  5. /* #define CALLBACK _stdcall  
  6.    typedef LONG     LRESULT;  
  7.    */ 
  8.  
  9. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);  
  10.  
  11. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,  
  12.                    LPSTR lpCmdLine,int nShowCmd)  
  13. {  
  14.     HWND hWnd;  
  15.     MSG msg;  
  16.     WNDCLASS wndclass;  
  17.  
  18.     static TCHAR szAppName[]=TEXT("SysMets1"); //static?  
  19.  
  20.     //初始化窗口類的屬性  
  21.     wndclass.cbClsExtra=0;  
  22.     wndclass.cbWndExtra=0;  
  23.  
  24.     wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //wndclass結構體的成員hbrBackground,類型是HBRUSH  
  25.     wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);   
  26.     wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //第一個參數爲什麼爲NULL?表示第二個參數加載的是系統默認圖標ID.  
  27.  
  28.     wndclass.hInstance=hInstance;  
  29.     wndclass.lpfnWndProc=WndProc;  
  30.  
  31.     wndclass.lpszClassName=szAppName;  
  32.     wndclass.lpszMenuName=NULL;  
  33.     wndclass.style=CS_HREDRAW | CS_VREDRAW;  
  34.  
  35.     //註冊窗口類  
  36.     if(!RegisterClass(&wndclass))  
  37.     {  
  38.         MessageBox(NULL,TEXT("This pragram requiers Windows NT."),  
  39.                    szAppName,MB_ICONERROR);  
  40.         return 0;  
  41.     }  
  42.  
  43.     //創建窗口  
  44.     hWnd=CreateWindow(szAppName,TEXT("Get System Metrics No.1"),WS_OVERLAPPEDWINDOW,  
  45.                       CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,  
  46.                       NULL,NULL,hInstance,NULL);  
  47.  
  48.     ShowWindow(hWnd,nShowCmd); //第二個參數:nShowCmd與iCmdShow?除了名字,一樣的.  
  49.     UpdateWindow(hWnd);  
  50.  
  51.     //循環獲取消息  
  52.     while(GetMessage(&msg,NULL,0,0))  
  53.     {  
  54.         TranslateMessage(&msg);  
  55.         DispatchMessage(&msg);  
  56.     }  
  57.  
  58.     return msg.wParam;  
  59. }  
  60.  
  61. LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)  
  62. {  
  63.     //定義變量  
  64.     static int cxChar,cyChar,cxCaps; //static?  
  65.     TCHAR  szBuffer[10];  
  66.     int i;  
  67.  
  68.     HDC hdc;  
  69.     PAINTSTRUCT ps;  
  70.     //RECT rect;  
  71.  
  72.     TEXTMETRIC tm;  
  73.  
  74.     //處理消息  
  75.     switch(message)  
  76.     {  
  77.     case WM_CREATE:  
  78.         hdc=GetDC(hWnd);  
  79.  
  80.         GetTextMetrics(hdc,&tm);  
  81.         cxChar=tm.tmAveCharWidth;  
  82.         cyChar=tm.tmHeight+tm.tmExternalLeading;  
  83.         cxCaps=((tm.tmPitchAndFamily&1)? 3:2)*cxChar / 2;  
  84.  
  85.         ReleaseDC(hWnd,hdc);  
  86.         return 0;  
  87.     case WM_PAINT:  
  88.         hdc=BeginPaint(hWnd,&ps);  
  89.  
  90.         for(i=0;i<NUMLINES;i++)  
  91.         {  
  92.             TextOut(hdc,0,cyChar * i,  
  93.                     sysmetrics[i].szLabel,  
  94.                     lstrlen(sysmetrics[i].szLabel));  
  95.  
  96.             TextOut(hdc,22 * cxCaps,cyChar * i,  
  97.                     sysmetrics[i].szDesc,  
  98.                     lstrlen(sysmetrics[i].szDesc));  
  99.  
  100.             SetTextAlign(hdc,TA_RIGHT | TA_TOP);  
  101.             TextOut(hdc,22*cxCaps + 40*cxChar,cyChar * i,  
  102.                     szBuffer,  
  103.                     wsprintf(szBuffer,TEXT("%5d"),GetSystemMetrics(sysmetrics[i].iIndex)));  
  104.             SetTextAlign(hdc,TA_LEFT | TA_TOP);  
  105.         }  
  106.  
  107.         EndPaint(hWnd,&ps);  
  108.         return 0;  
  109.     case WM_DESTROY:  
  110.         PostQuitMessage(0); //參數爲什麼爲0?把0傳給msg.wParam.  
  111.         return 0;  
  112.     }  
  113.  
  114.     return DefWindowProc(hWnd,message,wParam,lParam);  
  115. }  

函數原型:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章