Когда-то давно, уже лет 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; }