在 Dev-C++中編譯運行GUI 程序介紹(二)示例:祝福程序
前期見:
在 Dev-C++中編譯運行GUI 程序介紹(一)基礎 https://blog.csdn.net/cnds123/article/details/147019078
示例1、祝福程序
本文中的這個祝福程序是一個使用 Windows API 編寫的簡單 GUI 應用程序,比較簡單,可在 Dev-C++中編譯運行,主要用于顯示中秋節的祝福語。
運行效果
【編譯設置
在 Dev-C++ 中,找到 "工具" 菜單并選擇 "編譯選項"。
在 "編譯器" 選項卡中,將以下內容添加到 "鏈接器" 中:
-luser32 -lgdi32
或
-lgdi32 -lcrypt32
運行時,是否可以不顯示cmd黑窗口?
在 Dev-C++ 中隱藏命令提示符窗口條件:確保您創建的是一個 Windows GUI 應用程序,而不是控制臺應用程序。在 "鏈接器" 部分,添加 -mwindows 參數。這個參數告訴編譯器鏈接為 Windows 應用程序,而不是控制臺應用程序。
詳見簽約博文。】
源碼(參考自網路)如下
#include <windows.h>
#include <iostream> //string greetings[]用 using namespace std;//一個字符串數組,包含了祝福語。
string greetings[] = {"祝你每天如意吉祥!","祝你家庭幸福美滿!","愿你合家歡樂,幸福美滿,好運連連!","祝你事業順利,萬事如意,夢想成真!","祝你幸福快樂每一天!","祝你萬事如意,笑容如花,事業有成,家庭美滿!"
};int win_w,win_h; //用于存儲窗口的寬度和高度。HWND label,wish; //HWND 類型的句柄,分別用于窗口中的標簽和祝福文本。//該函數會從 greetings 數組中隨機選擇一條祝福語,并將其設置為窗口中顯示的文本。
void get_rand() {int index = rand() % (sizeof(greetings) / sizeof(greetings[0]));SetWindowText(wish, greetings[index].c_str());
}//這是 Windows 應用程序的核心功能,處理所有發送到窗口的消息
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {switch(Message) {case WM_CREATE: {//界面元素的創建static HFONT hFont = CreateFont(40,0,0,0,0,FALSE,FALSE,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"微軟雅黑");//創建字體// labellabel = CreateWindow("static", TEXT("祝福語言"), WS_CHILD | WS_VISIBLE | SS_CENTER, 0, 0, win_w, 45, hwnd,(HMENU)1,((LPCREATESTRUCT)lParam)->hInstance,NULL);SendMessage(label,WM_SETFONT,(WPARAM)hFont,TRUE);// wishstatic HFONT hFont2 = CreateFont(25,0,0,0,0,FALSE,FALSE,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"微軟雅黑");//創建字體wish = CreateWindow("static", TEXT(""), WS_CHILD | WS_VISIBLE | SS_CENTER, 0, 50, win_w, 45, hwnd,(HMENU)1,((LPCREATESTRUCT)lParam)->hInstance,NULL);SendMessage(wish,WM_SETFONT,(WPARAM)hFont2,TRUE);CreateWindow("button", TEXT("隨機"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 100, 150, 100, 45, hwnd,(HMENU)1001,((LPCREATESTRUCT)lParam)->hInstance,NULL);CreateWindow("button", TEXT("退出"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 300, 150, 100, 45, hwnd,(HMENU)1002,((LPCREATESTRUCT)lParam)->hInstance,NULL);LONG style = GetWindowLong(hwnd, GWL_STYLE); style &= ~(WS_MAXIMIZEBOX|WS_SIZEBOX|WS_MINIMIZE); SetWindowLong(hwnd, GWL_STYLE, style); get_rand();break;}case WM_COMMAND: {if(LOWORD(wParam)==1001){get_rand();} else if (LOWORD(wParam)==1002) {DestroyWindow(hwnd);}break; }case WM_DESTROY: {PostQuitMessage(0);break;}default:return DefWindowProc(hwnd, Message, wParam, lParam);}return 0;
}//這是 Windows 應用程序的入口點。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {WNDCLASSEX wc;HWND hwnd;MSG Msg;memset(&wc,0,sizeof(wc));wc.cbSize = sizeof(WNDCLASSEX);wc.lpfnWndProc = WndProc; /* insert window procedure function here */wc.hInstance = hInstance;wc.hCursor = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wc.lpszClassName = "WindowClass";wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* use "A" as icon name when you want to use the project icon */wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* as above */if(!RegisterClassEx(&wc)) {MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}win_h = 240;win_w = 640;hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","祝福",WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,win_w,win_h,NULL,NULL,hInstance,NULL);if(hwnd == NULL) {MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}while(GetMessage(&Msg, NULL, 0, 0) > 0) {TranslateMessage(&Msg);DispatchMessage(&Msg);}return Msg.wParam;
}
說明
windows.h:包含 Windows API 的所有功能,允許進行窗口創建、消息處理等。
iostream:用于輸入輸出操作。
窗口過程函數
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { ... }
這是 Windows 應用程序的核心功能,處理所有發送到窗口的消息,包括:
- WM_CREATE:窗口創建時調用,創建界面元素(標簽和按鈕)并初始化文本。
- WM_COMMAND:處理按鈕點擊事件。如果點擊“隨機”按鈕,就調用?get_rand()?函數;如果點擊“退出”按鈕,就銷毀窗口。
- WM_DESTROY:窗口被銷毀時,發送退出消息。
- 其他消息則調用默認窗口處理過程。
WinMain 函數
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ... }
這是 Windows 應用程序的入口點。主要步驟包括:
- 定義窗口類,并設置其屬性(如窗口過程、光標、背景等)。
- 注冊窗口類。
- 創建窗口并顯示。
- 進入消息循環,等待和處理窗口消息。
在 WinMain 函數中,調用 CreateWindowEx 創建窗口,并通過 ShowWindow 和 UpdateWindow 顯示窗口。
特別提示
需要注意的是,Windows API 開發應用程序并不一定都是圖形用戶界面(GUI)的。Windows API(應用程序編程接口)是一個功能豐富的庫,支持多種類型的應用程序開發,包括命令行工具、后臺服務、驅動程序以及傳統的 GUI 應用程序。
一個簡單的 Windows API 控制臺應用程序示例源碼:
#include <windows.h>
#include <stdio.h>int main() {SYSTEM_INFO sysInfo;GetSystemInfo(&sysInfo);printf("處理器數量: %d\n", sysInfo.dwNumberOfProcessors);printf("頁面大小: %d bytes\n", sysInfo.dwPageSize);MEMORYSTATUSEX memInfo;memInfo.dwLength = sizeof(MEMORYSTATUSEX);GlobalMemoryStatusEx(&memInfo);printf("總物理內存: %lld MB\n", memInfo.ullTotalPhys / (1024 * 1024));printf("可用物理內存: %lld MB\n", memInfo.ullAvailPhys / (1024 * 1024));return 0;
}
運行效果:
通過靈活使用 Windows API,你可以開發出適應各種場景的高效應用程序!?
我們這個系列主題,重點關注的是用戶交互界面(窗口)的GUI 應用程序。
開發簡單的小項目或游戲來應用所學知識,參考其他人的例子是一種好方法。后面還將給出我收集的更多的例子。