Win32_SDK_非模态对话框(非模态对话框窗口的销毁,模态与非模态对比,计算器项目练习)
生活随笔
收集整理的這篇文章主要介紹了
Win32_SDK_非模态对话框(非模态对话框窗口的销毁,模态与非模态对比,计算器项目练习)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1. 模態(tài)對話框與非模態(tài)對話框?qū)Ρ?/li>
- 2. 計(jì)算器項(xiàng)目練習(xí)模態(tài)與非模態(tài)對話框
- 3. 代碼位置
1. 模態(tài)對話框與非模態(tài)對話框?qū)Ρ?/h1>
- 模態(tài)對話框是通過DialogBox函數(shù)生成窗口,且函數(shù)的返回值是EndDialog函數(shù)傳遞的。EndDialog是銷毀窗口
- 非模態(tài)對話框CreateDialog 和ShowWindow 顯示一個(gè)窗口,使用DestroyWindow來銷毀對話框。EndDialog是隱藏窗口,沒有真正的銷毀
需要注意
2. 計(jì)算器項(xiàng)目練習(xí)模態(tài)與非模態(tài)對話框
平臺windows 工具Visual Studio2022
resource.h
//{{NO_DEPENDENCIES}} // Microsoft Visual C++ 生成的包含文件。 // 供 Calc.rc 使用 // #define IDD_MAIN_CALC 101 #define IDI_ICON1 103 #define IDC_BNT_REM 1002 #define IDC_BNT_DELEAT 1003 #define IDC_BNT_CLEAR 1004 #define IDC_BNT_DIV 1005 #define IDC_BNT_NUM7 1006 #define IDC_BNT_NUM8 1007 #define IDC_BNT_SUB 1008 #define IDC_BNT_NUM9 1009 #define IDC_BNT_NUM4 1010 #define IDC_BNT_NUM5 1011 #define IDC_BNT_MIN 1012 #define IDC_BNT_NUM6 1013 #define IDC_BNT_NUM1 1014 #define IDC_BNT_NUM2 1015 #define IDC_BNT_ADD 1016 #define IDC_BNT_NUM3 1017 #define IDC_BNT_ADDORMIN 1018 #define IDC_BNT_NUM0 1019 #define IDC_BNT_RET 1020 #define IDC_BNT_POINT 1021 #define IDC_STATIC_PERTEXT 1022 #define IDC_STATIC_SHOWTEXT 1023// Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1023 #define _APS_NEXT_SYMED_VALUE 101 #endif #endifCalc.h
#pragma once #include<Windows.h> #include"resource.h" #include<string> #include<map> #include <functional>HINSTANCE g_hInstance;std::wstring ShowText;//保存計(jì)算器顯示的字符串 std::wstring PreText; bool init = false;//判斷字符串是否刪除到0 bool is_op = false;//判斷是否按下操作按鈕 char op = 0;//記錄要的操作 double num = 0.0;//記錄被操作數(shù) double ret = 0.0;INT_PTR CALLBACK CalcProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {switch (msg){case WM_INITDIALOG:{//加載窗口圖標(biāo)HICON Hicon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON1));//發(fā)送設(shè)置窗口圖標(biāo)的消息SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)Hicon);//設(shè)置大圖標(biāo)SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)Hicon);//設(shè)置小圖標(biāo)//設(shè)置字體HFONT hfont=CreateFont(32, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, L"黑體");HFONT hfont_pre = CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, L"黑體");//獲取控件HWND text_hwnd=GetDlgItem(hwnd, IDC_STATIC_SHOWTEXT);HWND pre_hwnd = GetDlgItem(hwnd, IDC_STATIC_PERTEXT);SendMessage(text_hwnd, WM_SETFONT, WPARAM(hfont), 0);SendMessage(pre_hwnd, WM_SETFONT, WPARAM(hfont_pre), 0);break;}case WM_COMMAND:{init = false;//包裝器,包裝運(yùn)算std::map<char, std::function<float(float, float)>>opMap ={{'+',[](float x,float y) {return x + y; }},{'-',[](float x,float y) {return x - y; }},{'*',[](float x,float y) {return x * y; }},{'/',[](float x,float y) {return x / y; }},};switch (LOWORD(wParam)){case IDC_BNT_NUM0://寬字符連接ShowText += L"0";break;case IDC_BNT_NUM1:ShowText += L"1";break;case IDC_BNT_NUM2:ShowText += L"2";break;case IDC_BNT_NUM3:ShowText += L"3";break;case IDC_BNT_NUM4:ShowText += L"4";break;case IDC_BNT_NUM5:ShowText += L"5";break;case IDC_BNT_NUM6:ShowText += L"6";break;case IDC_BNT_NUM7:ShowText += L"7";break;case IDC_BNT_NUM8:ShowText += L"8";break;case IDC_BNT_NUM9:ShowText += L"9";break;case IDC_BNT_CLEAR:PreText.clear();ShowText.clear();ret = 0;num = 0;op = 0;SetDlgItemText(hwnd, IDC_STATIC_SHOWTEXT, L"0");init = true;break;case IDC_BNT_DELEAT:{if (ShowText.size() == 0) {SetDlgItemText(hwnd, IDC_STATIC_SHOWTEXT, L"0");init = true;}else if (ShowText.size() > 0) {ShowText.pop_back();if (ShowText.size() == 0) {SetDlgItemText(hwnd, IDC_STATIC_SHOWTEXT, L"0");init = true;}}break;}case IDC_BNT_ADD:{if (ShowText.size() != 0) {if (op != 0) {//此時(shí)已經(jīng)有操作符,說明沒有按=號,需要計(jì)算//這里先不處理break;}op = '+';ret = _wtoi(PreText.c_str());PreText = ShowText;PreText += L"+";ShowText.clear();}break;}case IDC_BNT_MIN:{if (ShowText.size() != 0) {if (op != 0) {break;}op = '-';PreText = ShowText;ret = _wtoi(PreText.c_str());PreText += L"-";ShowText.clear();}break;}case IDC_BNT_SUB:{if (ShowText.size() != 0) {if (op != 0) {break;}op = '*';PreText = ShowText;ret = _wtoi(PreText.c_str());PreText += L"×";ShowText.clear();}break;}case IDC_BNT_DIV:{if (ShowText.size() != 0) {if (op != 0) {break;}op = '/';PreText = ShowText;ret = _wtoi(PreText.c_str());PreText += L"÷";ShowText.clear();}break;}case IDC_BNT_RET:{if (op != 0) {num = _wtoi(ShowText.c_str());PreText += std::to_wstring(num);ret = opMap[op](ret, num);ShowText = std::to_wstring(ret);//清空符號op = 0;}break;}/*case IDC_BNT_REM:{double num= _wtoi(ShowText.c_str());ShowText = std::to_wstring((int)num*100);break;}case IDC_BNT_POINT:ShowText += L".";break;*/default:break;}//設(shè)置文本if (init == false) {SetDlgItemText(hwnd, IDC_STATIC_SHOWTEXT, ShowText.c_str());}SetDlgItemText(hwnd, IDC_STATIC_PERTEXT, PreText.c_str());break;}case WM_CLOSE:EndDialog(hwnd, IDOK);break;default:break;}return FALSE; }Calc.cpp
#include"Calc.h"extern HINSTANCE g_hInstance;int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow) {g_hInstance = hInstance;//主窗口DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_CALC), nullptr, CalcProc);return 0; }3. 代碼位置
Github
總結(jié)
以上是生活随笔為你收集整理的Win32_SDK_非模态对话框(非模态对话框窗口的销毁,模态与非模态对比,计算器项目练习)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 提高项目7-太乐
- 下一篇: 使用批处理修改注册表的命令参数