目前共有13篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:台灣正體▼
 
點擊 回復
1019 12
今天,我又把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訪問的控制項順序:

 
一派掌門 二十級
11樓 發表于:2015-12-1 23:34
文本框的ID都是默認的:
IDC_EDIT1
IDC_EDIT2
IDC_EDIT3
最後一個文本框要設為只讀(Read Only)
 
一派掌門 二十級
12樓 發表于:2015-12-1 23:35
然後就可以運行程序了。

 
一派掌門 二十級
13樓 發表于:2015-12-1 23:44
由於Win32程序是C++語言直接調用Windows API來創建和顯示窗口,所以並未使用到微軟的MFC類庫,也就不涉及到CString字符串類的操作。因此,直接把字符數組通過Windows 消息發送給文本框控制項就行了,讀取的時候也只需要調用GetWindowText函數把文本框中輸入的內容存入字符數組,和scanf幾乎完全一樣(除了scanf不能傳入空格這一點不同以外)

而MFC的CString則不同,通過調用GetBuffer()方法可以獲得字符數組指針的緩衝(操作這個字符串指針中的內容就會立刻影響CString字符串的內容),但是這個緩衝的大小是動態變化的,由CString內部決定,所以如果直接通過賦值\0來加長字符串就會導致數組越界而出錯。
 

回復帖子

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

本帖信息

點擊數:1019 回複數:12
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2015-12-1 23:44
 
©2010-2025 Purasbar Ver2.0
除非另有聲明,本站採用共享創意姓名標示-相同方式分享 3.0 Unported許可協議進行許可。