A. windows編程基礎 利用WIN32API編寫WinMain函數,完成窗口類的注冊,窗口的創建,顯示,更新,並完成消息循
///////////////////////////////////////////////////////////////
// 04FirstWindow.cpp文件
#include <stdio.h>
#include "stdafx.h"
// 窗口函數的函數原形
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char szClassName[] = "MainWClass";
WNDCLASSEX wndclass;
// 用描述主窗口的參數填充WNDCLASSEX結構
wndclass.cbSize = sizeof(wndclass); // 結構的大小
wndclass.style = CS_HREDRAW|CS_VREDRAW; // 指定如果大小改變就重畫
wndclass.lpfnWndProc = MainWndProc; // 窗口函數指針
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 = szClassName ; // 窗口類的名稱
wndclass.hIconSm = NULL; // 沒有類的小圖標
// 注冊這個窗口類
::RegisterClassEx(&wndclass);
// 創建主窗口
HWND hwnd = ::CreateWindowEx(
0, // dwExStyle,擴展樣式
szClassName, // lpClassName,類名
"My first Window!", // lpWindowName,標題
WS_OVERLAPPEDWINDOW, // dwStyle,窗口風格
CW_USEDEFAULT, // X,初始 X 坐標
CW_USEDEFAULT, // Y,初始 Y 坐標
CW_USEDEFAULT, // nWidth,寬度
CW_USEDEFAULT, // nHeight,高度
NULL, // hWndParent,父窗口句柄
NULL, // hMenu,菜單句柄
hInstance, // hlnstance,程序實例句柄
NULL) ; // lpParam,用戶數據
if(hwnd == NULL)
{
::MessageBox(NULL, "創建窗口出錯!", "error", MB_OK);
return -1;
}
// 顯示窗口,刷新窗口客戶區
::ShowWindow(hwnd, nCmdShow);
::UpdateWindow(hwnd);
// 從消息堆中取出消息
MSG msg;
while(::GetMessage(&msg,NULL, 0, 0))
{
// 轉化鍵盤消息
::TranslateMessage(&msg);
// 將消息發送到相應的窗口函數
::DispatchMessage(&msg);
}
// 當GetMessage返回0時程序結束
return msg.wParam;
}
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char szText[] = "最簡單的窗口程序!";
switch (message)
{
case WM_PAINT: // 窗口客戶區需要重畫
{
HDC hdc;
PAINTSTRUCT ps;
// 使無效的客戶區變的有效,並取得設備環境句柄
hdc = ::BeginPaint (hwnd, &ps) ;
// 顯示文字
::TextOut(hdc, 10, 10, szText, strlen(szText));
::EndPaint(hwnd, &ps);
return 0;
}
case WM_CHAR:
{
char szChar[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"Windows",MB_OK);
break;
}
case WM_LBUTTONDOWN:
{
MessageBox(hwnd,"mouse clicked","message",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"Windows program",strlen("Windows program"));
ReleaseDC(hwnd,hdc);
break;
}
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否退出程序?","Windows",MB_YESNO))
{
DestroyWindow(hwnd);
}
case WM_DESTROY: // 正在銷毀窗口
// 向消息隊列投遞一個WM_QUIT消息,促使GetMessage函數返回0,結束消息循環
::PostQuitMessage(0) ;
return 0 ;
}
// 將我們不處理的消息交給系統做默認處理
return ::DefWindowProc(hwnd, message, wParam, lParam);
}
B. 如何用Win32 API進行並口通信編程
在工程中添加parallelport.cpp文件,並在任何要調用這個類的模塊中#include parallelport.h文件。
你的代碼必須支持MFC框架,可以靜態鏈接,也可以是動態鏈接。
最好將afxtempl.h添加到預編譯頭中,以便提高編譯速度。
C. Win32編程原理
所謂的Win32開發,就是在C語言的層面上,直接使用Win32API開發Windows應用程序或者系統程序。雖說現在直接用Win32API開發應用程序的人已經不多了,但是深入理解Windows系統程序設計原理,仍然是成為Windows開發高手的良好途徑。所謂的Win32,其實是一個API規范,與UNIX系統編程介面標准POSIX是相對應的。下面是進行直接的WIN32SDK方式編程的基本思路或者說是一個框架:
一個Windows程序分為程序代碼和UI(UserInterface用戶介面)資源兩大部份,兩部份最後以RC編譯程序整合為一個完整的EXE文件。所謂UI資源是指功能菜單、對話框、程序圖標、游標形狀等等東西。這些UI資源的實際內容(二進制代碼)系藉助各種工具產生,並以各種擴展名存在,如.ico.bmp.cur等等。程序員必須在一個所謂的資源描述檔(.rc)中描述它們。RC編譯器(RC.EXE)讀取RC文件的描述後將所有UI資源文件集中製作出一個.RES文件,再與程序代碼結合在一起,這才是一個完整的Windows可執行文件。
與控制台程序相同的是,一個Win32程序也必須有一個程序入口點,但是在這兒它不再叫main(),而叫做WinMain(),當WINDOWS的SHELL檢測到用戶欲執行一個EXE程序,就會調用載入器把程序進行載入,然後調用Cstartupcode,後者再調用WinMain(),程序的執行就開始了,WinMain()函數的原型為:
intCALLBACKWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow);
下面程序必須進行必要的初始化工作-產生窗口,第一步是注冊一個窗口類:用API函數:RegisterClass(),而這個函數需要一個已經定義好的系統結構:WNDCLASS,這個結構裡面定義了窗口的種種屬性,需要自己定義,但是許多屬性都有默認值。然後調用CreateWindow()函數來產生具有上述定義屬性的已注冊窗口,但是需要注意的是它只是生成窗口,但並不顯示之,所以還需要調用一個函數ShowWindow()將它顯示在屏幕上,做完這些初始化工作以後,系統將進入消息循環:
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);}
當消息循環捕捉到消息以後將交由窗口函數WndProc()窗口函數進行相應的處理。這樣,一個基於消息事件驅動的WIN32程序的雛形就建立了起來。
D. Win32 API是什麼啊怎麼用
API是Application Programming Interface的縮寫,即應用程序介面,它是由Win32操作系統提供給程序員的一系列函數介面的集合,這些函數可以對計算機系統進行各種各樣的操作,比如創建窗口、描繪圖形、使用周邊設備等等,它們猶如「積木塊」一樣,可以搭建出各種界面豐富,功能靈活的應用程序。所以可以認為API函數是構築整個WINDOWS框架的基石,在它的下面是WINDOWS的操作系統核心,而它的上面則是所有的華麗的WINDOWS應用程序。Win32系統負責實現API函數,為我們的程序控制計算機搭建一座便捷的橋梁。
我們常用的VC中的MFC庫(微軟基礎類庫)就是Visual Sudio集成開發環境為我們提供的以面向對象方式對Win32 API的封裝,無論我們是否使用了MFC庫,只要是開發Win32程序歸根結底都要調用Win32 API。
Windows API包括幾千個可調用的函數,它們大致可以分為以下幾個大類:基本服務、組件服務、用戶界面服務、圖形多媒體服務、消息和協作、網路、Web服務。這么多函數全部記住當然不可能,也沒必要,如上所述,集成開發環境開發環境提供的類庫和控制項封裝了大部分的API函數,且易學易用,極大地減少了Windows程序員的工作量,當然即使這樣,為了使程序代碼簡潔及效率高,我們的程序往往偶爾還需要直接調用Win32 API,所以我們還是需要適當的記住一些完成某些常用功能的API函數名,用法參數可以不記,因為可以現用現查。
至於MSDN,它是開發文檔,使用它可以方便地查詢Win32 API的功能、使用方法。