SDK:对话框,光标,字符串,位图,应用图标,语言

代码下载地址: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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值