導航:首頁 > 編程語言 > windowsapi編程實例

windowsapi編程實例

發布時間:2023-06-02 22:53:40

❶ 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);
}

❷ 最簡單的Windows API編程 求解

知其然要知其所以然。不管你是直接C++ source file, 還是 win32 Application,只要你了解其本質,那麼你可以通過簡單的配置,使你的程序成功運行起來。下面我告訴你如何在命令提示符(cmd.exe 或 command prompt)下編譯你的程序。
1.如何進入初始化編譯器環境的命令提示符:
1)如果還是使用VC++6.0。那麼在開始->運行中輸入cmd, 然後回車。在cmd.exe中使用cd命令進入你的VC++6.0安裝目錄的VC目錄下,應該可以找到vcvars32.bat, 然後在cmd.exe運行vcvars32.bat批處理腳步就可以了。
2)如果是VS 2005 2008 2010 2012,那麼在開始中找到對應目錄,在這個目錄下有個開發工具目錄,裡面有個vs x32 command prompt, 直接點擊就可以了。

2.如何在以上命令提示符中編譯你的程序,假設你上面的程序文件為test.c:
cl /? #查看編譯器使用幫助

cl /OUT:test.exe kernel32.lib user32.lib gdi32.lib /SUBSYSTEM:WINDOWS /ENTRY:WinMainStartup /MANIFEST:NO /MD test.c

這樣可以成功編譯出來的text.exe

Tip: 問題的關鍵是/SUBSYSTEM和/ENTRY

/SUBSYSTEM: [CONSOLES, WINDOWS, ...] 這是主要的兩個參數。

/ENTRY: [WinMainStartup, mainCRTStartup] 就這兩個參數。(WinMainStartup可能是WinMainCRTStartup,我記不清了)

問題關聯:

1.當你直接C++ source file時,/SUBSYSTEM:CONSOLES /ENTRY:mainCRTStartup (這時入口函數時main,<report LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main >, 它說crt0.obj使用了一個叫main的函數,你卻沒有寫...)

2.當你使用win32 application時,/SUBSYSTEM:WINDOWS /ENTRY:WinMainCRTStartup (這時你的程序符合要求,因為它找到了WinMain函數)

拓展:
#include<windows.h>
#pragma comment(lib,"User32.lib")
int main(int argc, char *argv[])
{
MessageBox(NULL,TEXT("開始學習"),TEXT("消息對話框"),MB_OK);
return 0;
}
把WinMain改成標准C/C++的main之後如何運行程序,因為你使用MessageBox函數,使用了win32 API, 故/SUBSYSTEM:WINDOWS。又因為你使用main函數為程序入口函數,故/ENTRY:mainCTRStartup。編譯命令如下:

cl /OUT:test.exe kernel32.lib user32.lib gdi32.lib /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup /MANIFEST:NO /MD test.c

Note: 以上參數都可以在VC++開發環境工程設置裡面進行更改設置,由於我是在Unix下工作,很久沒有接觸VC,以上參數可能存在偏差,請使用cl /? link /? res /? nmake /?等自行仔細查看。另外,我建議開始編程使用命令加腳本的方式編程,學會使用自己編寫Makefile, 因為VC++的圖形開發環境本質就是建立在各種腳本之上,所以對排查程序錯誤能夠有本質上的認識。

閱讀全文

與windowsapi編程實例相關的資料

熱點內容
穿越皇帝當種馬 瀏覽:48
程序員和對象關系不清楚 瀏覽:133
能編輯文件夾的程序 瀏覽:981
國產劇情中國大胸女孩 瀏覽:761
滅門慘案哪三部 瀏覽:1002
蝴蝶gl電影 瀏覽:848
主角叫陸離的小說 瀏覽:99
大寸度電影全裸帶毛 瀏覽:292
韓國一個女的彈鋼琴什麼電影 瀏覽:828
實現伺服器上文件如何下載到本地 瀏覽:268
日本大電影什麼意思 瀏覽:859
紅城堡有電影版嗎 瀏覽:710
阿文是哪部電影的人物 瀏覽:662
閔度允演坐輪椅的電影 瀏覽:913
全國新增命令 瀏覽:192
安卓如何恢復蘋果設置 瀏覽:861
盛勢txt 瀏覽:771
兩只狼老大和一個小嬰兒是什麼電影 瀏覽:435
三洋帝度冰箱壓縮機 瀏覽:299