設置 | 登錄 | 註冊

目前共有13篇帖子。

今天,我又把C語言課本上的Insert Str程序做成了Win32版本的對話框程序

1樓 巨大八爪鱼 2015-12-1 23:23
運行效果:

2樓 巨大八爪鱼 2015-12-1 23:25
其中這個InsertStr窗口是通過主窗口的File菜單的Show Dialog...命令(或者按下對應的快捷鍵Ctrl + O)打開的:

3樓 巨大八爪鱼 2015-12-1 23:26
這是課本上的程序:
void insert(wchar_t *s1, wchar_t *s2)
{
    int f = 0;
    int len1 = wcslen(s1);
    int len2 = wcslen(s2);
    wchar_t *p1 = s1;
    wchar_t *p2 = s1 + len1 - 1;
    while (*p1 != '\0' && *p1 != *s2)
        p1++;
    if (*p1 != '\0')
    {
        for (; p2 > p1; p2--)
            *(p2 + len2 - 1) = *p2;
        f = 1;
    }
    while (*s2)
        *p1++ = *s2++;
    *(s1 + len1 + len2 - f) = '\0';
}
本來是在控制台窗口中運行的,我把它搬到了Windows窗口程序中拿來用。
把所有的char改成wchar_t(寬字符,用於支持中文等雙字節字符),strlen改成wcslen,其他的全部照著書上的抄下來。
4樓 巨大八爪鱼 2015-12-1 23:27
在菜單資源中添加一個新菜單項:

Caption: &Show Dialog...\tCtrl+O
ID: ID_FILE_SHOWDIALOG
5樓 巨大八爪鱼 2015-12-1 23:28
打開rc中的快捷鍵資源IDC_WIN32PROJECT1,添加一個新快捷鍵Ctrl + O:

ID可以不修改,就用默認的。
6樓 巨大八爪鱼 2015-12-1 23:30
在C++源文件中的WndProc函數中,switch (wmId)下添加如下內容:
case ID_FILE_SHOWDIALOG:
case ID_ACCELERATOR32772:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Dlg1);
    break;
7樓 巨大八爪鱼 2015-12-1 23:30
創建函數:
INT_PTR CALLBACK Dlg1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        Dlg1_Init(hDlg);
        return (INT_PTR)TRUE;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:
            Dlg1_GetResult(hDlg);
            break;
        case IDCANCEL:
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

void Dlg1_Init(HWND hDlg)
{
    HWND tf1 = GetDlgItem(hDlg, IDC_EDIT1);
    HWND tf2 = GetDlgItem(hDlg, IDC_EDIT2);
    SendMessage(tf1, WM_SETTEXT, NULL, (LPARAM)L"abcdef");
    SendMessage(tf2, WM_SETTEXT, NULL, (LPARAM)L"d45");
}

void insert(wchar_t *s1, wchar_t *s2)
{
    int f = 0;
    int len1 = wcslen(s1);
    int len2 = wcslen(s2);
    wchar_t *p1 = s1;
    wchar_t *p2 = s1 + len1 - 1;
    while (*p1 != '\0' && *p1 != *s2)
        p1++;
    if (*p1 != '\0')
    {
        for (; p2 > p1; p2--)
            *(p2 + len2 - 1) = *p2;
        f = 1;
    }
    while (*s2)
        *p1++ = *s2++;
    *(s1 + len1 + len2 - f) = '\0';
}

void Dlg1_GetResult(HWND hDlg)
{
    HWND tf1 = GetDlgItem(hDlg, IDC_EDIT1);
    HWND tf2 = GetDlgItem(hDlg, IDC_EDIT2);
    HWND tf3 = GetDlgItem(hDlg, IDC_EDIT3);
    wchar_t s1[100];
    wchar_t s2[100];
    GetWindowText(tf1, s1, 500);
    GetWindowText(tf2, s2, 500);
    insert(s1, s2);
    SendMessage(tf3, WM_SETTEXT, NULL, (LPARAM)s1);
}
8樓 巨大八爪鱼 2015-12-1 23:32
在頭文件(Win32Project1.h)添加如下函數聲明:
void Dlg1_Init(HWND hDlg);
void insert(wchar_t *s1, wchar_t *s2);
void Dlg1_GetResult(HWND hDlg);

下面這一行可以放到cpp文件的// Forward declarations of functions included in this code module:下面的最後一行:
INT_PTR CALLBACK    Dlg1(HWND, UINT, WPARAM, LPARAM);
當然也可以直接放到頭文件中
9樓 巨大八爪鱼 2015-12-1 23:32
(可選)
按下面帖子中所述的方法啟用XP風格控制項:
https://zh.arslanbar.net/post.php?t=22016
10樓 巨大八爪鱼 2015-12-1 23:33
對話框的布局:

Ctrl + D設置的Tab訪問的控制項順序:

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。