代码下载地址:SDK:对话框,光标,字符串,位图,应用图标,语言
程序运行结果展示
// SDK.cpp : 定义应用程序的入口点。
#include "stdafx.h"
#include "SDK.h"
#include "cstdio"
#include <commdlg.h>
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst; // 当前实例
WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
HWND hDlgModeless;
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK CHOSEBITMAP(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK RADIOBITMAP(HWND, UINT, WPARAM, LPARAM);
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此放置代码。
// 初始化全局字符串
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_SDK, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
MSG msg;
// 主消息循环:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDR_CHINESEMENU);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = NULL;
return RegisterClassExW(&wcex);
}
//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 将实例句柄存储在全局变量中
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
int ChooseCheckBitmap[3] = { 0, 0, 0 }; // 模式对话框的选择标记。
int chooseRadioBitmap = 0; // 无模式对话框的选择标记。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HMENU hMenu = GetMenu(hWnd);
static int IsChinese = 1;
static int selectIcon[3] = { 1, 0, 0 };
static int selectShow[4] = { 0, 0, 0, 0 };
static int selectCursor[3] = { 1, 0, 0 };
static HBITMAP hBitmap[3];
static int x[3], y[3];
switch (message)
{
case WM_CREATE:
CheckMenuRadioItem(hMenu, ID_ICONN1, ID_ICONN3, ID_ICONN1, MF_BYCOMMAND);
CheckMenuRadioItem(hMenu, ID_CURSORARROW, ID_CURSORDIY, ID_CURSORARROW, MF_BYCOMMAND);
CheckMenuRadioItem(GetMenu(hWnd), ID_CHINESE, ID_ENGLISH, ID_CHINESE, MF_BYCOMMAND);
hBitmap[0] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));//获取位图句柄
hBitmap[1] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
hBitmap[2] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP3));
BITMAP bitmap1, bitmap2, bitmap3;
GetObject(hBitmap[0], sizeof(BITMAP), &bitmap1);
GetObject(hBitmap[1], sizeof(BITMAP), &bitmap2);
GetObject(hBitmap[2], sizeof(BITMAP), &bitmap3);
x[0] = bitmap1.bmWidth;
y[0] = bitmap1.bmHeight;
x[1] = bitmap2.bmWidth;
y[1] = bitmap2.bmHeight;
x[2] = bitmap3.bmWidth;
y[2] = bitmap3.bmHeight;
break;
case WM_INITMENU:
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case ID_MODALDIALOG:
{
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, CHOSEBITMAP);
InvalidateRect(hWnd, NULL, TRUE);
}
break;
case ID_MODALESSDIALOG:
{
if (!IsWindow(hDlgModeless))
{
hDlgModeless = CreateDialog (hInst, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, RADIOBITMAP);
ShowWindow(hDlgModeless, SW_SHOW);
}
}
break;
case ID_FILEDIALOG:
{
// Initialize OPENFILENAME
OPENFILENAME ofn;
char szFile[260] = " ";
ZeroMemory(&ofn, sizeof(OPENFILENAME)); //清零
ofn.lStructSize = sizeof(OPENFILENAME); //用来表示win版本
ofn.hwndOwner = hWnd; //对话框父窗口
ofn.lpstrFile = (LPWSTR)szFile; //存放地址
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("All(*.*)\0 *.*\0Text(*.txt)\0 * .TXT\0PDF Files(*.pdf)\0 * .PDF\0"); //限制类型
ofn.nFilterIndex = 1; //初始选中是那个 1表示第二个(txt)
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT;
// Display the Open dialog box.
if (GetOpenFileName(&ofn) == TRUE)
MessageBox(hWnd, (LPWSTR)szFile, TEXT("文件名"), MB_OK);
}
break;
case ID_ABOUT:
{
LPCTSTR MyInformation = TEXT("第5次上机练习(SDK)\n对话框、光标、字符串、位图\n\n学号:***********\n姓名:***");
MessageBox(hWnd, MyInformation, TEXT("Lab5(SDK)"), MB_OK | MB_ICONASTERISK);
}
break;
case ID_EXIT:
DestroyWindow(hWnd);
break;
case ID_ICONN1:
case ID_ICONN2:
case ID_ICONN3:
{
int selectID = wmId - ID_ICONN1;
if (!selectIcon[selectID]) //用selectIcon数组判断当前菜单项是不是已经选择过了
{
if (MessageBox(hWnd, TEXT("确认要修改吗?"), TEXT("Confirmation"), MB_YESNO | MB_ICONQUESTION) == IDYES)//选择了YES
{
for (int i = 0; i < 3; i++)
selectIcon[i] = 0;
selectIcon[selectID] = 1;
//用圆形标记选中项,并清除其他选项的标记
CheckMenuRadioItem(hMenu, ID_ICONN1, ID_ICONN3, wmId, MF_BYCOMMAND);
//同步改变标题栏和桌面应用的图标
SetClassLong(hWnd, GCL_HICON, (LONG)LoadIcon(hInst, MAKEINTRESOURCE(selectID + IDI_ICON1)));
//如果选择的是图标3,就灰化“显示”菜单
if (wmId == ID_ICONN3)
EnableMenuItem(hMenu, 2, MF_GRAYED | MF_BYPOSITION);
else
EnableMenuItem(hMenu, 2, MF_ENABLED | MF_BYPOSITION);
}
}
DrawMenuBar(hWnd); //更新菜单
InvalidateRgn(hWnd, NULL, TRUE); //更新窗口
}
break;
case ID_SHOW1:
case ID_SHOW2:
case ID_SHOW3:
case ID_SHOW4:
{
if (CheckMenuItem(hMenu, wmId, MF_CHECKED) == MF_CHECKED)
{
CheckMenuItem(hMenu, wmId, MF_UNCHECKED);
selectShow[wmId - ID_SHOW1] = 0;
}
else
selectShow[wmId - ID_SHOW1] = 1;
InvalidateRgn(hWnd, NULL, TRUE); //更新窗口
}
break;
case ID_CURSORARROW:
case ID_CURSORCROSS:
case ID_CURSORDIY:
{
CheckMenuRadioItem(hMenu, ID_CURSORARROW, ID_CURSORDIY, wmId, MF_BYCOMMAND);
for (int i = 0; i < 3; i++)
selectCursor[i] = 0;
if (wmId == ID_CURSORARROW)
{
SetClassLong(hWnd, GCLP_HCURSOR, (LONG)LoadCursor(NULL, IDC_ARROW));
selectCursor[0] = 1;
}
else if (wmId == ID_CURSORCROSS)
{
SetClassLong(hWnd, GCLP_HCURSOR, (LONG)LoadCursor(NULL, IDC_CROSS));
selectCursor[1] = 1;
}
else
{
SetClassLong(hWnd, GCLP_HCURSOR, (LONG)LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR)));
selectCursor[2] = 1;
}
InvalidateRgn(hWnd, NULL, TRUE); //更新窗口
}
break;
case ID_ENGLISH:
{
//切换成英文菜单并销毁原菜单
SetMenu(hWnd, LoadMenu(hInst, MAKEINTRESOURCE(IDR_ENGLISHMENU)));
DestroyMenu(hMenu);
CheckMenuRadioItem(GetMenu(hWnd), ID_CHINESE, ID_ENGLISH, wmId, MF_BYCOMMAND);
CheckMenuRadioItem(GetMenu(hWnd), ID_ICONN1, ID_ICONN3, ID_ICONN1, MF_BYCOMMAND);
CheckMenuRadioItem(GetMenu(hWnd), ID_CURSORARROW, ID_CURSORDIY, ID_CURSORARROW, MF_BYCOMMAND);
IsChinese = 0;
SetWindowText(hWnd, TEXT("Lab(WX)")); //更改标题
InvalidateRgn(hWnd, NULL, TRUE); //更新窗口
}
break;
case ID_CHINESE:
{
//切换成中文菜单并销毁原菜单
SetMenu(hWnd, LoadMenu(hInst, MAKEINTRESOURCE(IDR_CHINESEMENU)));
DestroyMenu(hMenu);
CheckMenuRadioItem(GetMenu(hWnd), ID_CHINESE, ID_ENGLISH, wmId, MF_BYCOMMAND);
CheckMenuRadioItem(GetMenu(hWnd), ID_ICONN1, ID_ICONN3, ID_ICONN1, MF_BYCOMMAND);
CheckMenuRadioItem(GetMenu(hWnd), ID_CURSORARROW, ID_CURSORDIY, ID_CURSORARROW, MF_BYCOMMAND);
IsChinese = 1;
SetWindowText(hWnd, szTitle); //更改标题
InvalidateRgn(hWnd, NULL, TRUE); //更新窗口
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
static LPCTSTR IconState[4], CursorState[3];
//显示"图标"信息
if (IsChinese)
{
IconState[0] = TEXT("当前使用的图标:图标1"); IconState[1] = TEXT("当前使用的图标:图标2");
IconState[2] = TEXT("当前使用的图标:图标3");
}
else
{
IconState[0] = TEXT("Current icon:Icon1"); IconState[1] = TEXT("Current icon:Icon2");
IconState[2] = TEXT("Current icon:Icon3");
}
for (int i = 0; i < 3; i++)
{
if (selectIcon[i])
TextOut(hdc, 10, 10, IconState[i], lstrlen(IconState[i]));
}
//显示"光标"信息
if (IsChinese)
{
CursorState[0] = TEXT("当前使用的光标:光标1"); CursorState[1] = TEXT("当前使用的光标:光标2");
CursorState[2] = TEXT("当前使用的光标:光标3");
}
else
{
CursorState[0] = TEXT("Current cursor:Cursor1"); CursorState[1] = TEXT("Current cursor:Cursor2");
CursorState[2] = TEXT("Current cursor:Cursor3");
}
for (int i = 0; i < 3; i++)
{
if (selectCursor[i])
TextOut(hdc, 10, 30, CursorState[i], lstrlen(CursorState[i]));
}
//显示"显示"信息
LPCTSTR ShowText[4];
if (IsChinese)
{
ShowText[0] = TEXT("显示1"); ShowText[1] = TEXT("显示2");
ShowText[2] = TEXT("显示3"); ShowText[3] = TEXT("显示4");
}
else
{
ShowText[0] = TEXT("Show1"); ShowText[1] = TEXT("Show2");
ShowText[2] = TEXT("Show3"); ShowText[3] = TEXT("Show4");
}
for (int i = 0; i < 4; i++)
{
if (selectShow[i])
TextOut(hdc, 50 + (i % 2) * 50, 100 + (i / 2) * 50, ShowText[i], lstrlen(ShowText[i]));
}
//显示模式对话框的位图
HDC hdcc = CreateCompatibleDC(hdc);
for (int i = 0; i < 3; i++)
{
if (ChooseCheckBitmap[i])
{
SelectObject(hdcc, hBitmap[i]);
BitBlt(hdc, 200, 50 + 100 * i, x[i], y[i], hdcc, 0, 0, SRCCOPY);
}
}
SelectObject(hdcc, hBitmap[chooseRadioBitmap - IDC_RADIO1]);
BitBlt(hdc, 400, 50, x[chooseRadioBitmap - IDC_RADIO1], y[chooseRadioBitmap - IDC_RADIO1], hdcc, 0, 0, SRCCOPY);
//一定不要漏掉
DeleteDC(hdcc);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// 模式对话框的消息处理程序。
INT_PTR CALLBACK CHOSEBITMAP(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
for (int i = 0; i < 3; i++) //恢复上一次选项
{
if (ChooseCheckBitmap[i])
CheckDlgButton(hDlg, IDC_CHECK1 + i, BST_CHECKED);
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_CHECK1:
case IDC_CHECK2:
case IDC_CHECK3:
{
int ci = LOWORD(wParam) - IDC_CHECK1;
ChooseCheckBitmap[ci] = !ChooseCheckBitmap[ci];
}
break;
case IDC_OK:
EndDialog(hDlg, TRUE);
break;
case IDC_CANCLE:
EndDialog(hDlg, FALSE);
break;
}
break;
}
return (INT_PTR)FALSE;
}
// 无模式对话框的消息处理程序。
INT_PTR CALLBACK RADIOBITMAP(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
static int choose = 0;
switch (message)
{
case WM_INITDIALOG:
CheckRadioButton(hDlg, IDC_RADIO1, IDC_RADIO3, chooseRadioBitmap);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_RADIO1:
case IDC_RADIO2:
case IDC_RADIO3:
choose = LOWORD(wParam);
break;
case IDOK:
chooseRadioBitmap = choose;
InvalidateRect(GetParent(hDlg), NULL, TRUE); // 更新显示
break;
case IDCANCEL:
DestroyWindow(hDlg);
break;
}
break;
}
return (INT_PTR)FALSE;
}