導航:首頁 > 編程語言 > 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編程實例相關的資料

熱點內容
珠海存儲伺服器地址怎麼找 瀏覽:413
md5演算法字元串長度 瀏覽:4
可以二次虛化的雲伺服器 瀏覽:779
思科2500編程器固件 瀏覽:235
php開發桌面應用程序 瀏覽:904
支付寶app哪裡可以加油 瀏覽:71
路由器ttl刷編程器固件 瀏覽:719
縱向加密密鑰協商狀態時間 瀏覽:851
mc花雨庭伺服器有些什麼 瀏覽:809
linux製作網頁 瀏覽:19
xlsx加密忘記了怎麼辦 瀏覽:999
app湖北農信怎麼解約 瀏覽:426
在線編程教育項目 瀏覽:759
電信采購5萬台伺服器干什麼用 瀏覽:200
騰訊雲伺服器登錄地址 瀏覽:988
程序員在地鐵上寫字 瀏覽:555
解壓包未知文件格式怎麼辦 瀏覽:578
程序員破壞資料庫 瀏覽:331
sh格式如何編譯 瀏覽:344
虛擬伺服器雲主機哪個好 瀏覽:98