作者共發了10篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:不轉換▼
 
點擊 回復
351 9
【Win32程序】能读取和保存数据的Rename对话框
一派護法 十九級
1樓 發表于:2015-12-3 21:45

下拉框中的选项:


如果目录下存在指定的文件(这里是rdf.dat),那么就从中读取数据并显示到各个控件里。
不存在的话各控件就留空,等待用户输入。
当点击OK按钮的时候,保存输入的数据到文件。如果点击Cancel则不保存。
一派護法 十九級
2樓 發表于:2015-12-3 21:45
该对话框通过File菜单的Rename命令打开。

一派護法 十九級
3樓 發表于:2015-12-3 21:48
【程序】
在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都是用的默认的。
一派護法 十九級
4樓 發表于:2015-12-3 21:49
【头文件: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();
一派護法 十九級
5樓 發表于:2015-12-3 21:49
【源文件: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);
}
一派護法 十九級
6樓 發表于:2015-12-3 21:52
【参考: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
一派護法 十九級
7樓 發表于:2015-12-3 21:54
对于那个下拉菜单框IDC_COMBO1,要把Type设置为Drop List,禁止用户手动输入文字:

一派護法 十九級
8樓 發表于:2015-12-3 21:55
这是点击OK按钮后保存的文件:

用记事本打开后的内容:

一派護法 十九級
9樓 發表于:2015-12-3 22:00
【对话框的布局】

一派護法 十九級
10樓 發表于:2015-12-3 22:00
【对话框Tab键顺序】

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:351 回複數:9
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2015-12-3 22:00
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。