在 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,"微软雅黑");//创建字体
- // label
- label = 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);
-
- // wish
- static 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 应用程序。
开发简朴的小项目或游戏来应用所学知识,参考其他人的例子是一种好方法。背面还将给出我收集的更多的例子。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |