MASM32 Создаю форму, кидаю на неё Memo и RichEdit. Создаю манифест(отдельным файлом <имя файла>.manifest) Запускаю, и вижу: Memo отображается в стиле XP, а RichEdit в стиле Win98 Как заставить RichEdit отображаться в стиле XP? P.S. Если нужно могу показать код и скриншот
Скрин: Код: Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD RGB macro red,green,blue xor eax,eax mov ah,blue shl eax,8 mov ah,green mov al,red endm szText MACRO Name,Text:VARARG LOCAL lbl jmp lbl Name db Text,0 lbl: ENDM .const RichEdit1ID equ 2 Memo1ID equ 1 .data? hwndRichEdit1 HWND ? hwndMemo1 HWND ? hInstance HINSTANCE ? CommandLine LPSTR ? .data TextRichEdit1 db "RichEdit1",0 TextMemo1 db "Memo1",0 ;_______________ ClassName db "Class_name",0 BtnClName db "button",0 StatClName db "static",0 EditClName db "edit",0 LboxClName db "listbox",0 CboxClName db "combobox",0 ReditClName db "RICHEDIT20A",0 RichEditLib db "riched20.dll",0 FormCaption db "Form",0 ;_______________ .code start: invoke GetModuleHandle,NULL mov hInstance,eax invoke GetCommandLine invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc :WNDCLASSEX LOCAL msg :MSG LOCAL hwnd :HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style,CS_BYTEALIGNCLIENT mov wc.lpfnWndProc,offset WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx,addr wc invoke CreateWindowEx,0,ADDR ClassName,ADDR FormCaption,WS_SYSMENU or WS_SIZEBOX,444,152,211,237,0,0,hInst,0 mov hwnd,eax INVOKE ShowWindow,hwnd,SW_SHOWNORMAL INVOKE UpdateWindow,hwnd .WHILE TRUE invoke GetMessage,ADDR msg,0,0,0 .BREAK .IF (!eax) invoke TranslateMessage,ADDR msg invoke DispatchMessage,ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .IF uMsg == WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg == WM_CREATE invoke LoadLibrary,ADDR RichEditLib invoke CreateWindowEx,0,ADDR ReditClName,ADDR TextRichEdit1,WS_CHILDWINDOW or ES_AUTOHSCROLL or ES_AUTOVSCROLL or ES_NOHIDESEL or ES_SUNKEN or ES_MULTILINE or WS_VSCROLL or WS_HSCROLL or WS_VISIBLE,8,104,185,89,hWnd,RichEdit1ID,hInstance,0 mov hwndRichEdit1,eax invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR TextMemo1,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or ES_AUTOVSCROLL or ES_MULTILINE or WS_VISIBLE,8,8,185,89,hWnd,Memo1ID,hInstance,0 mov hwndMemo1,eax .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start Манифест: Код (Text): <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <description>Program Description</description> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Program Name" type="win32" /> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>
Attack Т.е. ломаете голову, как бы заставить RichEdit воспроизводить ошибку comctl32 v.6 в стиле XP с WS_EX_CLIENTEDGE у Edit-а ?? Вы вот задали ващему RichEdit-окну - ES_SUNKEN без WS_EX_CLIENTEDGE. Но проверьте стиль созданного окна: оно таки имеет WS_EX_CLIENTEDGE. Ага, это обеспечил ES_SUNKEN. А могли и просто изначально задать WS_EX_CLIENTEDGE Короче, RichEdit показывает WS_EX_CLIENTEDGE-границу именно так, как должна выглядеть WS_EX_CLIENTEDGE-граница всякого Edit-а "в стиле XP". Вот тут есть кое-что по этой теме: http://rsdn.ru/forum/winapi/3217290.all.aspx ("Границы edit box").
kero, простите, я так и не понял что вы мне предлагаете =( Для начала что за ошибка "comctl32 v.6 в стиле XP с WS_EX_CLIENTEDGE у Edit-а" ? Далее, я заменил ES_SUNKEN на WS_EX_CLIENTEDGE, вот результат: Также почитал топик по вашей ссылке, но там про то как отключить XP Стиль... Короче, даже команда SetWindowTheme, hwndRichEdit1, 0, 0 не включает стиль для RichEdit'а
> Для начала что за ошибка "comctl32 v.6 в стиле XP с WS_EX_CLIENTEDGE у Edit-а" ? Если не поняли: для Edit утрачена "углубленность" границы от WS_EX_CLIENTEDGE, и многие тому не рады (что видно и по той ссылке). Но в вашем случае, оказывается, все наоборот. Ну, тогда почитайте, к примеру, это: http://www.codeguru.com/cpp/w-p/win32/tutorials/article.php/c8729 ("XP Theme Support for Rich Edit and Custom Controls").
kero, да пример в статье действительно работает! Однако, пока я перепишу всё это дело на асм, я с ума сойду. Ну что же придётся пока довольствоваться старым RichEdit'ом Кстати, я заметил одну особенность, если взять библиотеку RichEd20.dll от MS Office 2007 и положить её в папку с программой, то RichEdit отображается как надо! Вот:
насчот бреда извиняюсь, никогда не забивал голову ..этим , без рамки ричэдит смотрится лучшее, комер - буратино попробуй загнать манифест в ресурсы ... это нужно делать в любом случае...
Blackbeam, положение манифеста(внутри или снаружи) роли не играет, всё отображается одинаково. kero, "кинуть или положить" это не вариант, я просто привёл пример. Усилия тут тоже не при чём, я просто не смогу этого сделать, т.к. изучаю асм первую неделю...
согласен -------------- а нет у кого нить работающего кода на масме - чтобы ричэдит выравнивал текст по краям страницы? буду благодарен не смог сам разобраться ... там нужно вызывать парочку функций и есчо что-то ... и вот проблема которую пока решить не могу - каким образом можно сделать редактор на 2 страницы - но с возможностью непосредственного редактирования текста? ( без редактирования конечно проблем никаких нет..) - т.е нажимает например бэкспэйс в конце левой страницы и строка из правой должна переползать на левую?