在 Dev-C++中编译运行GUI 程序先容(二)示例:祝福程序 ...

打印 上一主题 下一主题

主题 1779|帖子 1779|积分 5337

在 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 应用程序,而不是控制台应用程序。

详见签约博文。】

源码(参考自网路)如下
  1. #include <windows.h>
  2. #include <iostream>  //string greetings[]用
  3. using namespace std;
  4. //一个字符串数组,包含了祝福语。  
  5. string greetings[] = {
  6.         "祝你每天如意吉祥!",
  7.         "祝你家庭幸福美满!",
  8.         "愿你合家欢乐,幸福美满,好运连连!",
  9.         "祝你事业顺利,万事如意,梦想成真!",
  10.         "祝你幸福快乐每一天!",
  11.         "祝你万事如意,笑容如花,事业有成,家庭美满!"
  12. };
  13. int win_w,win_h;  //用于存储窗口的宽度和高度。
  14. HWND label,wish;  //HWND 类型的句柄,分别用于窗口中的标签和祝福文本。
  15. //该函数会从 greetings 数组中随机选择一条祝福语,并将其设置为窗口中显示的文本。
  16. void get_rand() {
  17.     int index = rand() % (sizeof(greetings) / sizeof(greetings[0]));
  18.     SetWindowText(wish, greetings[index].c_str());
  19. }
  20. //这是 Windows 应用程序的核心功能,处理所有发送到窗口的消息
  21. LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
  22.         switch(Message) {
  23.                 case WM_CREATE: {
  24.                             //界面元素的创建
  25.                         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,"微软雅黑");//创建字体
  26.                         // label
  27.                         label = CreateWindow("static", TEXT("祝福语言"), WS_CHILD | WS_VISIBLE | SS_CENTER, 0, 0, win_w, 45, hwnd,
  28.                         (HMENU)1,((LPCREATESTRUCT)lParam)->hInstance,NULL);
  29.                         SendMessage(label,WM_SETFONT,(WPARAM)hFont,TRUE);
  30.                         
  31.                         // wish
  32.                         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,"微软雅黑");//创建字体
  33.                         wish = CreateWindow("static", TEXT(""), WS_CHILD | WS_VISIBLE | SS_CENTER, 0, 50, win_w, 45, hwnd,
  34.                         (HMENU)1,((LPCREATESTRUCT)lParam)->hInstance,NULL);
  35.                         SendMessage(wish,WM_SETFONT,(WPARAM)hFont2,TRUE);
  36.                         
  37.                         CreateWindow("button", TEXT("随机"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 100, 150, 100, 45, hwnd,
  38.                         (HMENU)1001,((LPCREATESTRUCT)lParam)->hInstance,NULL);
  39.                         
  40.                         CreateWindow("button", TEXT("退出"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 300, 150, 100, 45, hwnd,
  41.                         (HMENU)1002,((LPCREATESTRUCT)lParam)->hInstance,NULL);
  42.                                  
  43.                         LONG style = GetWindowLong(hwnd, GWL_STYLE);        
  44.                         style &= ~(WS_MAXIMIZEBOX|WS_SIZEBOX|WS_MINIMIZE);        
  45.                         SetWindowLong(hwnd, GWL_STYLE, style);        
  46.                         get_rand();
  47.                         break;
  48.                 }
  49.                 case WM_COMMAND: {
  50.                         if(LOWORD(wParam)==1001){
  51.                                 get_rand();
  52.                         }
  53.                         else if (LOWORD(wParam)==1002) {
  54.                                 DestroyWindow(hwnd);
  55.                         }
  56.                     break;
  57.                 }
  58.                 case WM_DESTROY: {
  59.                         PostQuitMessage(0);
  60.                         break;
  61.                 }
  62.                 default:
  63.                         return DefWindowProc(hwnd, Message, wParam, lParam);
  64.         }
  65.         return 0;
  66. }
  67. //这是 Windows 应用程序的入口点。
  68. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  69.         WNDCLASSEX wc;
  70.         HWND hwnd;
  71.         MSG Msg;
  72.         memset(&wc,0,sizeof(wc));
  73.         wc.cbSize                 = sizeof(WNDCLASSEX);
  74.         wc.lpfnWndProc         = WndProc; /* insert window procedure function here */
  75.         wc.hInstance         = hInstance;
  76.         wc.hCursor                 = LoadCursor(NULL, IDC_ARROW);
  77.         wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  78.         wc.lpszClassName = "WindowClass";
  79.         wc.hIcon                 = LoadIcon(NULL, IDI_APPLICATION); /* use "A" as icon name when you want to use the project icon */
  80.         wc.hIconSm                 = LoadIcon(NULL, IDI_APPLICATION); /* as above */
  81.         if(!RegisterClassEx(&wc)) {
  82.                 MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
  83.                 return 0;
  84.         }
  85.          
  86.         win_h = 240;
  87.         win_w = 640;
  88.         hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","祝福",WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,win_w,win_h,NULL,NULL,hInstance,NULL);
  89.         if(hwnd == NULL) {
  90.                 MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
  91.                 return 0;
  92.         }
  93.         while(GetMessage(&Msg, NULL, 0, 0) > 0) {
  94.                 TranslateMessage(&Msg);
  95.                 DispatchMessage(&Msg);
  96.         }
  97.         return Msg.wParam;
  98. }
复制代码
说明
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 控制台应用程序示例源码:
  1. #include <windows.h>
  2. #include <stdio.h>
  3. int main() {
  4.     SYSTEM_INFO sysInfo;
  5.     GetSystemInfo(&sysInfo);
  6.     printf("处理器数量: %d\n", sysInfo.dwNumberOfProcessors);
  7.     printf("页面大小: %d bytes\n", sysInfo.dwPageSize);
  8.     MEMORYSTATUSEX memInfo;
  9.     memInfo.dwLength = sizeof(MEMORYSTATUSEX);
  10.     GlobalMemoryStatusEx(&memInfo);
  11.     printf("总物理内存: %lld MB\n", memInfo.ullTotalPhys / (1024 * 1024));
  12.     printf("可用物理内存: %lld MB\n", memInfo.ullAvailPhys / (1024 * 1024));
  13.     return 0;
  14. }
复制代码
运行结果:

通过机动使用 Windows API,你可以开发出适应各种场景的高效应用程序! 

我们这个系列主题,重点关注的是用户交互界面(窗口)的GUI 应用程序。
开发简朴的小项目或游戏来应用所学知识,参考其他人的例子是一种好方法。背面还将给出我收集的更多的例子。




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表