Вспоминаем Си. RichEdit Control

Когда-то давно, уже лет 7-10 назад, я довольно сносно писал на си. И даже что-то получалось. Сейчас же я настолько об-Web-ился, что не могу вспомнить даже самого элементарного. Конечно же будем использовать устаревшие методы чистый WinAPI. :) Итак:
Используемые инструменты:

Встретил проблему, рисуем в редакторе ресурсов / пишем сами в любом редакторе диалоговое окошко с элементом управления RichEdit.
Например:

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>

#define IDD_MAIN2                               102
#define IDD_MAIN5                               105
#define IDC_RICHEDIT1                           1000
#define IDC_BTN_TEST                            1001
#define IDC_BTN_QUIT                            1002
//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT
IDD_MAIN2 DIALOGEX 6, 5, 289, 260
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SETFONT |
      WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME |
      WS_GROUP | WS_SYSMENU
EXSTYLE WS_EX_WINDOWEDGE
CAPTION "Test 2.0"
FONT 8, "Tahoma", 0, 0, 1
{
    PUSHBUTTON      "&Test", IDC_BTN_TEST, 235, 215, 46, 15
    PUSHBUTTON      "&Quit", IDC_BTN_QUIT, 236, 235, 46, 15
    CONTROL         "Rich Edit", IDC_RICHEDIT1, RICHEDIT_CLASS,
                    WS_TABSTOP | WS_BORDER | ES_AUTOHSCROLL | ES_READONLY,
                    6, 9, 276, 200
}

LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT
IDD_MAIN5 DIALOGEX 6, 5, 289, 260
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SETFONT |
      WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME |
      WS_GROUP | WS_SYSMENU
EXSTYLE WS_EX_WINDOWEDGE
CAPTION "Test 5.0"
FONT 8, "Tahoma", 0, 0, 1
{
    PUSHBUTTON      "&Test", IDC_BTN_TEST, 235, 215, 46, 15
    PUSHBUTTON      "&Quit", IDC_BTN_QUIT, 236, 235, 46, 15
    CONTROL         "Rich Edit", IDC_RICHEDIT1, "RICHEDIT50W",
                    WS_TABSTOP | WS_BORDER | ES_AUTOHSCROLL | ES_READONLY,
                    6, 9, 276, 200
}

пишем простенький сырец:

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>

#define IDD_MAIN2                               102
#define IDD_MAIN5                               105
#define IDC_RICHEDIT1                           1000
#define IDC_BTN_TEST                            1001
#define IDC_BTN_QUIT                            1002

HINSTANCE hInst;

BOOL CALLBACK mainDlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
    switch (msg) {
        case WM_CLOSE:
            EndDialog(hwnd, 0);
            return 1L;
    }
    return 0L;
}


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow) {
    hInst = hInstance;
    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN2),NULL,mainDlgProc);
}

компилим:

rc /r /fo test.res test.rc
cl -c /Fotest.obj test.cpp
link /release -out:test.exe kernel32.lib user32.lib test.obj test.res

И …. получаем фигу. При запуске программы, ничего не происходит. Она тихо вылетает с ошибкой.

Ковырялся я из-за отсутствия практики довольно долго, и в конце-концов нашел решение в виде:

...
//    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN2),NULL,mainDlgProc);
    HMODULE hLib;

    if (hLib=LoadLibrary("RICHED32.DLL"))
        DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN2),NULL,mainDlgProc);
    else
        MessageBox(NULL, "Error", "Sorry, can't start up!", MB_OK);

    if (hLib)
        FreeLibrary(hLib);
...

Компилим снова, и все прекрасно заработало. Однако «RICHED32.DLL» уже устарела, и вместо нее можно / нужно подгружать «MSFTEDIT.DLL» и вместо ресурса IDD_MAIN2 использовать IDD_MAIN5.

В итоге я получил такой исходник:

#include 
#include 
#include 

#define IDD_MAIN2                               102
#define IDD_MAIN5                               105
#define IDC_RICHEDIT1                           1000
#define IDC_BTN_TEST                            1001
#define IDC_BTN_QUIT                            1002

HINSTANCE hInst;

BOOL CALLBACK mainDlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
    switch (msg) {
        case WM_CLOSE:
            EndDialog(hwnd, 0);
            return 1L;
    }
    return 0L;
}


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow) {
    hInst = hInstance;
    HMODULE hLib;

    if (hLib=LoadLibrary("msftedit.dll"))
        DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN5),NULL,mainDlgProc);
    else if (hLib=LoadLibrary("RICHED32.DLL"))
        DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN2),NULL,mainDlgProc);
    else
        MessageBox(NULL, "Error", "Sorry, can't start up!", MB_OK);

    if (hLib)
        FreeLibrary(hLib);

    return 0;
}
Запись опубликована в рубрике Программирование с метками , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий