在 Dev-C++中編譯運行GUI 程序介紹(二)示例:祝福程序

在 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 應用程序。

開發簡單的小項目或游戲來應用所學知識,參考其他人的例子是一種好方法。后面還將給出我收集的更多的例子。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77480.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77480.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77480.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Stable Diffusion 四重調參優化——項目學習記錄

學習記錄還原&#xff1a;在本次實驗中&#xff0c;我基于 Stable Diffusion v1.5模型&#xff0c;通過一系列優化方法提升生成圖像的質量&#xff0c;最終實現了圖像質量的顯著提升。實驗從基礎的 Img2Img 技術入手&#xff0c;逐步推進到參數微調、DreamShaper 模型和 Contro…

Solidity智能合約漏洞類型與解題思路指南

一、常見漏洞類型與通俗解釋 1. 重入攻擊(Reentrancy) ?? 通俗解釋:就像你去銀行取錢,柜臺人員先給你錢,然后再記賬。你拿到錢后立即又要求取錢,由于賬還沒記,柜臺又給你一次錢,這樣循環下去你就能拿走銀行所有的錢。 漏洞原理:合約在更新狀態前調用外部合約,允許…

Docker部署.NetCore8項目

在VS.net新建.netCore8項目&#xff0c;生成項目的發布文件&#xff0c;之后添加Dockerfile&#xff0c;內容如下&#xff1a; FROM mcr.microsoft.com/dotnet/aspnet:8.0 # 設置工作目錄 WORKDIR /app # 掛載臨時卷&#xff08;類似于 VOLUME /tmp&#xff09; VOLUME /tmp …

【C++】右值引用、移動語義與完美轉發

左值、右值是C常見的概念&#xff0c;那么什么是右值引用&#xff0c;移動語義&#xff0c;完美轉發呢&#xff1f;本UP帶大家了解一下C校招常問的C11新特性。 左值與右值 左值&#xff1a;明確存儲未知、可以取地址的表達式 右值&#xff1a;臨時的、即將被銷毀的&#xff…

艾爾登法環地圖不能使用鼠標移動或點擊傳送點原因和設置方法

今天玩艾爾登法環突發發現地圖不能用鼠標點擊傳送點了。 找了半天發現設置地圖選單的游標移動方式只有鍵盤了&#xff0c;改成鍵盤與鼠標就好啦。

【算法】——一鍵解決動態規劃

前言 動態規劃是一種高效解決??重疊子問題??和??最優子結構??問題的算法思想。它通過??分治記憶化??&#xff0c;將復雜問題分解為子問題&#xff0c;并存儲中間結果&#xff0c;避免重復計算&#xff0c;從而大幅提升效率。 ??為什么重要&#xff1f;? ??優化…

uniApp開發微信小程序-連接藍牙連接打印機上岸!

歷經波折三次成功上岸&#xff01; 三次經歷簡單絮叨一下&#xff1a;使用uniAppvue開發的微信小程序&#xff0c;使用藍牙連接打印機&#xff0c;藍牙所有的接口都是插件中封裝的&#xff0c;用的插件市場中的這個&#xff1a; dothan-lpapi-ble &#xff1b;所以&#xff0c…

軟件系統安全設計方案,信息化安全建設方案(Word原件)

1.1 總體設計 1.1.1 設計原則 1.2 物理層安全 1.2.1 機房建設安全 1.2.2 電氣安全特性 1.2.3 設備安全 1.2.4 介質安全措施 1.3 網絡層安全 1.3.1 網絡結構安全 1.3.2 劃分子網絡 1.3.3 異常流量管理 1.3.4 網絡安全審計 1.3.5 網絡訪問控制 1.3.6 完…

wsl2+ubuntu22.04安裝blenderproc教程

本章教程,介紹如何在windows操作系統上通過wsl2+Ubuntu22.04上安裝blenderproc。 一、pipi安裝方式 推薦使用minconda3安裝Python環境。 pip install Blenderproc二、源碼安裝 1、下載源碼 git clone https://github.com/DLR-RM/BlenderProc2、安裝依賴 cd BlenderProc &am…

Blender 轉 STL 文件全攻略:從基礎到進階

在 3D 建模與打印領域&#xff0c;Blender 憑借其強大的功能和開源特性&#xff0c;深受創作者喜愛。而 STL 文件格式&#xff0c;作為 3D 打印行業的通用標準&#xff0c;能被絕大多數 3D 打印軟件和設備所識別。因此&#xff0c;將 Blender 模型轉換為 STL 文件&#xff0c;是…

Ansys Electronics 變壓器 ACT

你好&#xff0c; 在本博客中&#xff0c;我將討論如何使用 Ansys 電子變壓器 ACT 自動快速地設計電力電子電感器或變壓器。我將逐步介紹設計和創建電力電子變壓器示例的步驟&#xff0c;該變壓器為同心組件&#xff0c;雙繞組&#xff0c;采用正弦電壓激勵&#xff0c;并應用…

nacos配置達夢數據庫驅動源代碼步驟

1.在父工程pom.xml添加依賴&#xff1a; <dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.1.193</version> </dependency> 2.在nacos-config模塊pom.xml添加依賴&#xff1…

4.9-4.10學習總結 Stream流練習+方法引用+異常

Stream流練習&#xff1a; 1.打印數組內的偶數。 import java.util.*; import java.util.function.BiConsumer; public class test {public static void main(String[] args) {ArrayList<Integer> listnew ArrayList<>();Collections.addAll(list,1,2,3,4,5,6,7,…

FPGA系統開發板調試過程不同芯片的移植步驟介紹

目錄 1.我目前使用的開發板 2.不同開發板的移植 步驟一&#xff1a;芯片型號設置 步驟二&#xff1a;約束修改 步驟三、IP核更新 關于FPGA系統開發板調試過程中不同芯片的移植。我需要先理清楚FPGA開發中移植到不同芯片的一般流程。首先&#xff0c;移植通常涉及到更換FPG…

復現QGIS-MCP教程

由于Claude國內下載不了嘗試使用Cursor 下載安裝Cursor Cursor - The AI Code Editor 本示例安裝的是0.46版本 UV安裝 簡介 安裝 安裝成功 配置環境變量 驗證 下載代碼 git clone gitgithub.com:jjsantos01/qgis_mcp.git QGIS插件安裝 文件拷貝 您需要將 qgis_mcp_plu…

java筆記03

基本數據類型 數據值是存儲在自己的空間中。 特點&#xff1a;賦值給其他變量&#xff0c;也是賦的真實的值。 引用數據類型 數據值是存儲在其他空間中&#xff0c;自己空間中存儲的是地址值。 特點&#xff1a;賦值給其他變量&#xff0c;賦的地址值。 綜合練習 使用 ctrl…

【開發工具】快速自定義圖標元素的顏色

如果你想要一個輕量級、簡單易用 的小工具來快速自定義圖標元素的顏色&#xff08;比如調整 SVG/PNG 圖標的顏色&#xff0c;或者生成多色圖標&#xff09;&#xff0c;可以試試以下工具&#xff1a; 1. 在線工具&#xff08;無需安裝&#xff09; SVG/PNG 圖標改色 - Recol…

【CompletableFuture】異步編程

CompletableFuture異步編程 CompletableFuture介紹與傳統 Future 的對比使用方法1. 使用 supplyAsync&#xff08;有返回值&#xff09;使用 runAsync&#xff08;無返回值&#xff09;指定自定義線程池 處理異步結果1. thenApply&#xff1a;轉換結果2.thenAccept&#xff1a;…

【TS學習】(23)理解類的雙重角色

在 TypeScript 中&#xff0c;類&#xff08;class&#xff09;不僅是一個運行時的值&#xff08;即可以實例化對象的構造函數&#xff09;&#xff0c;同時也是一個類型聲明。具體來說&#xff0c;類在 TypeScript 中既聲明了值&#xff0c;也聲明了類型&#xff0c;并且它的類…

IAP Firmware Upload Tools.exe IAP 網絡固件升級教程

IAP是In Application Programming的簡寫&#xff0c;IAP升級可以被視為固件升級的一種形式,它是一種在應用程序運行過程中對固件進行更新的技術手段。允許MCU在運行過程中對MCU User Flash的部分區域進行燒寫,目的是為了代替編程器對MCU燒錄的依賴。 主程序UI 軟件按鈕說明&a…