Windows 程式設計簡介從C/C++到Windows程式設計

neuyu發表於2021-09-09

Windows 程式設計簡介

一、從C/C++到Windows程式設計

 

前面我們學習的C/C++程式都是DOS程式(或稱為Windows控制檯程式),也就是現在大學裡的開設的《C/C++程式設計》的內容,這些程式由於不涉及到Windows 程式設計的細節,因此比較容易入門學習,這對訓練初學者的程式設計思想是很有用的,也是有益的。但是當我們基本掌握了C/C++程式設計後,就不能僅僅停留在DOS下(或Windows控制檯下)編寫、執行程式。我們應該從程式設計思想的訓練到Windows實用程式設計的轉變。

一個最簡單的Windows C程式。

include

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL,"Hello 歡迎使用Turbo C for Windows 整合實驗與學習環境!","我的第一個Windows程式",MB_OK);
return 0;
}

程式的執行結果是:

程式解析:

1、windows.h是每一個Windows程式都需要的標頭檔案。

2、WinMain函式是所有Windows C程式的入口,類似於DOS C中的main函式。

3、MessageBox是一個Win32 API函式(API,Application Programming Interface 應用程式介面),其作用是彈出一個對話方塊,顯示訊息的內容。該函式的第一個引數是用來指定父視窗控制程式碼,即對話方塊所在的視窗控制程式碼。第二個引數是用來顯示訊息的內容(你可以修改成你想顯示的內容)。第三個引數是 對話方塊標的標題,如本例的“我的第一個Windows程式”,第四個引數是指定對話方塊中顯示的按鈕,試一試,將MB_OK修改成MB_OKCANCEL,執行一下程式會出現什麼結果,再試一試修改成MB_RETRYCANCEL

 

試一試將個求1+2+3+…+100的和的DOS C程式修改成Windows 程式。

include "stdio.h"

main()
{
int sum=0,i;
for(i=1;i {
sum=sum+i;
}
printf("1-100自然書數的和是:%dn",sum);
}

 

參考程式:

 

include
include
include

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
int sum=0,i;
char str1[40]="1-100自然書數的和是:",str2[10];
for(i=1;i {
sum=sum+i;
}
itoa(sum,str2,10); /將整型變數sum的運算結果轉化字串str2,以方便顯示/
strcat(str1,str2); /將str1的值(1-100自然書數的和是:)與str2連線,以方便顯示/

MessageBox(NULL,str1,"第二個Win32程式",MB_OK);
return 0;

}

執行結果:

二、Windows 程式簡介

 

(1)Windows C程式的組成:

 

1.C程式原始檔,副檔名為.c或.cpp

2.標頭檔案,副檔名為.h

3.資原始檔,副檔名為.rc

 

(2)源程式的組成結構

 

Windows C程式有相對固定的基本結構,一般有入口函式WinMain和視窗函式。

 

1、WinMain函式

 

是所有Windows C程式的入口,類似於DOS C的main函式,其功能是完成一系列的定義和初始化工作,併產生訊息迴圈。訊息迴圈是整個程式執行的核心。

WinMain函式有三個基本的組成部分:函式說明、初始化和訊息迴圈

a、WinMain函式的說明:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)

引數說明:

hInstance 應用程式當前例項控制程式碼

hPrevInstance 前一個例項控制程式碼,在32位系統中該引數永遠是NULL

szCmdLine 程式執行時的命令列引數

iCmdShow 程式執行時的顯示方式,如最大化、最小化、隱藏顯示等。

 

b、初始化

初始化包括視窗類的定義、註冊、建立視窗例項和顯示視窗四部分。

這是固定格式,所有的Windows程式基本一樣,記住即可,具體參見下面的程式例項的註釋。

 

2、視窗函式

 

視窗函式定義了Windows C程式對接受到的不同訊息的響應,其中包含了應用程式對各種可能接收到的訊息的處理過程,是訊息處理分支控制語句的集合。通常視窗函式是有一個或多個switch語句組成。每一條case語句對應一種訊息,當應用程式接收到一個訊息時,就會執行相應case 語句下的程式模組來完成相應的功能。

視窗函式說明:

 

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

引數說明:

hwnd 視窗控制程式碼

message 代表所處理訊息的訊息值

wParam 訊息的附加引數,是message的進一步資訊

lParam 訊息的附加引數,是message的進一步資訊

 

一般用法:

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{
...
switch (message)
{
case 常數1:
...

       case  常數2:

              ...

 

       ...

              case WM_DESTROY:
                     PostQuitMessage (0) ; //在訊息佇列中插入一條“退出”訊息
                     return 0 ;
       }
       return DefWindowProc (hwnd, message, wParam, lParam);//執行預設的訊息處理
  }

 

視窗函式的主體是訊息處理語句,該語句是有一系列case語句組成。我們學習者自需要根據視窗可能收到的訊息在case語句中編寫相應的處理程式即可。

   三、一個簡單的Windows C程式:Hello World程式

 

include

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; //視窗函式宣告

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow) //WinMain函式說明
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ; //視窗控制程式碼
MSG msg ; //訊息結構
WNDCLASS wndclass ; //視窗類結構

  //下面是視窗類的定義
  wndclass.style = CS_HREDRAW | CS_VREDRAW ;
  wndclass.lpfnWndProc = WndProc ;
  wndclass.cbClsExtra = 0 ;
  wndclass.cbWndExtra = 0 ;
  wndclass.hInstance = hInstance ;
  wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;//載入圖示供程式使用
  wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //載入滑鼠指標供程式使用
  wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;//獲取一個圖形物件,在這個例子中,是獲取繪製視窗背景的刷子
  wndclass.lpszMenuName = NULL ;
  wndclass.lpszClassName = szAppName ;

 //下面是視窗類的註冊
  if (!RegisterClass (&wndclass))//為程式視窗註冊視窗類
 {
       return 0 ;
 }

 //根據視窗類建立視窗
 hwnd = CreateWindow (szAppName, TEXT ("一個簡單的Win32程式"), 
              WS_OVERLAPPEDWINDOW, 
              CW_USEDEFAULT, 
              CW_USEDEFAULT, 
              CW_USEDEFAULT, 
              CW_USEDEFAULT, 
              NULL, 
              NULL, 
              hInstance, 
              NULL

            ) ; 

 //顯示視窗

 ShowWindow (hwnd, iCmdShow) ; 
 UpdateWindow (hwnd) ; //指示視窗重新整理自身

 //訊息迴圈

 while (GetMessage (&msg, NULL, 0, 0)) 
 {
      TranslateMessage (&msg) ; //轉換某些鍵盤訊息
       DispatchMessage (&msg) ; //將訊息傳送給視窗過程
 }
 return msg.wParam ;

}
 

//視窗函式
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;

switch (message)
{
     case WM_PAINT:
            hdc = BeginPaint (hwnd, &ps) ; //開始視窗繪製
            GetClientRect (hwnd, &rect) ; //獲取視窗客戶區的尺寸
            DrawText (hdc, TEXT ("Hello World!"), -1, &rect,
             DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; //顯示Hello World,可以修改程式你要顯示的內容

            EndPaint (hwnd, &ps) ; //結束視窗繪製
            return 0 ;

     case WM_DESTROY:
            PostQuitMessage (0) ; //在訊息佇列中插入一條“退出”訊息
            return 0 ;
}
 return DefWindowProc (hwnd, message, wParam, lParam);//執行預設的訊息處理

}

 

提示:該程式的原始碼在《簡單的入門程式例項》中

 

四、總結

 

   所有Windows 程式的基本結構都與上面的例項相同或相近(說明:有的程式是將視窗類和窗機視窗封住成函式後呼叫,其實質是一樣的),記住一個例子,編寫其他程式時,在其上面修改即可。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4550/viewspace-2807920/,如需轉載,請註明出處,否則將追究法律責任。

相關文章