|
|
【Win32程序】能读取和保存数据的Rename对话框 |
一派護法 十九級 |
下拉框中的选项: 如果目录下存在指定的文件(这里是rdf.dat),那么就从中读取数据并显示到各个控件里。 不存在的话各控件就留空,等待用户输入。 当点击OK按钮的时候,保存输入的数据到文件。如果点击Cancel则不保存。
|
一派護法 十九級 |
该对话框通过File菜单的Rename命令打开。
|
一派護法 十九級 |
【程序】 在Win32Project1.cpp中包含头文件: #include "RenameDlg.h"
然后在WndProc函数中的case WM_COMMAND:的switch (wmId)下,添加如下分支代码: case ID_FILE_RENAME: case ID_ACCELERATOR32775: RenameDlg_Show(hInst, hWnd); break; 其中第一个是菜单项的ID,第二个是快捷键的ID。这两个自己去资源文件里添加,ID都是用的默认的。
|
一派護法 十九級 |
【头文件:RenameDlg.h】 void RenameDlg_Show(HINSTANCE hInst, HWND hWnd); INT_PTR CALLBACK RenameDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); void RenameDlg_Init(HWND hDlg); void LoadRD(); void SaveRD(); void RenameDlg_UpdateCtrls();
|
一派護法 十九級 |
【源文件:RenameDlg.cpp】 #include "stdafx.h" #include <stdio.h> #include <Windows.h> #include "RenameDlg.h" #include "resource.h"
#define RD_FILE "rdf.dat" #define RD_MAXCNT 255
struct RenameData { wchar_t str_zhcn[RD_MAXCNT]; wchar_t str_zhtw[RD_MAXCNT]; int autoConversion; int autoCorrection; } rd;
struct { HWND edit1; HWND edit2; HWND combo1; HWND check1; } ctrls;
const wchar_t *combo1_items[] = {L"No conversion", L"From Simplified Chinese", L"From Traditional Chinese", NULL};
void RenameDlg_Show(HINSTANCE hInst, HWND hWnd) { DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, RenameDlg); }
INT_PTR CALLBACK RenameDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { int wmId = LOWORD(wParam); int wmEvent = HIWORD(wParam); switch (message) { case WM_INITDIALOG: RenameDlg_Init(hDlg); return (INT_PTR)TRUE; case WM_COMMAND: switch (wmId) { case IDOK: SaveRD(); case IDCANCEL: EndDialog(hDlg, wmId); return (INT_PTR)TRUE; case IDC_COMBO1: if (wmEvent == CBN_SELCHANGE) RenameDlg_UpdateCtrls(); break; } break; } return (INT_PTR)FALSE; }
void RenameDlg_Init(HWND hDlg) { int i; ctrls.edit1 = GetDlgItem(hDlg, IDC_EDIT1); ctrls.edit2 = GetDlgItem(hDlg, IDC_EDIT2); ctrls.combo1 = GetDlgItem(hDlg, IDC_COMBO1); ctrls.check1 = GetDlgItem(hDlg, IDC_CHECK1); for (i = 0; combo1_items[i] != NULL; i++) SendMessage(ctrls.combo1, CB_ADDSTRING, NULL, (LPARAM)combo1_items[i]); LoadRD(); }
void LoadRD() { FILE *fp; fopen_s(&fp, RD_FILE, "r"); if (fp == NULL) { SendMessage(ctrls.combo1, CB_SETCURSEL, (WPARAM)0, NULL); return; } fread(&rd, sizeof(rd), 1, fp); fclose(fp);
SetWindowText(ctrls.edit1, rd.str_zhcn); SetWindowText(ctrls.edit2, rd.str_zhtw); SendMessage(ctrls.combo1, CB_SETCURSEL, (WPARAM)rd.autoConversion, NULL); rd.autoCorrection = SendMessage(ctrls.check1, BM_SETCHECK, (WPARAM)rd.autoCorrection, NULL); RenameDlg_UpdateCtrls(); }
void SaveRD() { FILE *fp; fopen_s(&fp, RD_FILE, "w"); GetWindowText(ctrls.edit1, rd.str_zhcn, RD_MAXCNT); GetWindowText(ctrls.edit2, rd.str_zhtw, RD_MAXCNT); rd.autoConversion = SendMessage(ctrls.combo1, CB_GETCURSEL, NULL, NULL); rd.autoCorrection = SendMessage(ctrls.check1, BM_GETCHECK, NULL, NULL); fwrite(&rd, sizeof(rd), 1, fp); fclose(fp); }
void RenameDlg_UpdateCtrls() { int ac = SendMessage(ctrls.combo1, CB_GETCURSEL, NULL, NULL); EnableWindow(ctrls.edit1, ac != 2); EnableWindow(ctrls.edit2, ac != 1); }
|
一派護法 十九級 |
【参考:Win32Project1.rc资源文件】 【菜单部分】 ///////////////////////////////////////////////////////////////////////////// // // Menu //
IDC_WIN32PROJECT1 MENU BEGIN POPUP "&File" BEGIN MENUITEM "&String Insertion...\tCtrl+S", ID_FILE_SHOWDIALOG MENUITEM "Rename...\tCtrl+R", ID_FILE_RENAME MENUITEM SEPARATOR MENUITEM "E&xit", IDM_EXIT END POPUP "&Help" BEGIN MENUITEM "&About ...", IDM_ABOUT END END
【快捷键部分】 ///////////////////////////////////////////////////////////////////////////// // // Accelerator //
IDC_WIN32PROJECT1 ACCELERATORS BEGIN "S", ID_ACCELERATOR32772, VIRTKEY, CONTROL, NOINVERT "/", IDM_ABOUT, ASCII, ALT, NOINVERT "?", IDM_ABOUT, ASCII, ALT, NOINVERT "R", ID_ACCELERATOR32775, VIRTKEY, CONTROL, NOINVERT END
【Rename对话框】 IDD_DIALOG2 DIALOGEX 0, 0, 309, 134 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Rename" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN GROUPBOX "Name for variants",IDC_STATIC,7,7,295,66 LTEXT "Simplified Chinese:",IDC_STATIC,29,26,60,8 EDITTEXT IDC_EDIT1,97,24,188,14,ES_AUTOHSCROLL LTEXT "Traditional Chinese:",IDC_STATIC,25,48,64,8 EDITTEXT IDC_EDIT2,97,47,188,14,ES_AUTOHSCROLL LTEXT "Auto Conversion:",IDC_STATIC,32,80,57,8 COMBOBOX IDC_COMBO1,97,78,131,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Auto Correction",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,98,98,67,10 DEFPUSHBUTTON "OK",IDOK,198,113,50,14 PUSHBUTTON "Cancel",IDCANCEL,252,113,50,14 END
|
一派護法 十九級 |
对于那个下拉菜单框IDC_COMBO1,要把Type设置为Drop List,禁止用户手动输入文字:
|
一派護法 十九級 |
这是点击OK按钮后保存的文件: 用记事本打开后的内容:
|
一派護法 十九級 |
【对话框的布局】
|
一派護法 十九級 |
【对话框Tab键顺序】
|
|
|
|