Русский / Russian English / Английский

Сейчас на форуме: Wiz_41 (+6 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Вопросы новичков —› Masm winapi font
Посл.ответ Сообщение

Ранг: 1.2 (гость)
Статус: Участник

Создано: 17 марта 2020 19:08 New!
Цитата · Личное сообщение · #1

Ребят, подскажите пожалуйста, есть программка на asm под masm с winapi и одним окошком (CreateWindowEx), хотелось бы поменять стандартный шрифт на кнопках, лэйблах, эдитах. Есть ли какие нибудь функции на подобие CreateFont, или еще какие способы?

Ранг: 44.3 (посетитель)
Статус: Участник

Создано: 17 марта 2020 19:23 New!
Цитата · Личное сообщение · #2

Поменять на нестандартный шрифт, который программа сама будет в систему устанавливать?


Ранг: 256.3 (наставник)
Статус: Участник

Создано: 17 марта 2020 19:33 · Поправил: f13nd New!
Цитата · Личное сообщение · #3

А зачем наподобие? CreateFontIndirectA(), SendMessageA(,WM_SETFONT,,)


Ранг: 69.3 (постоянный)
Статус: Участник

Создано: 17 марта 2020 19:56 New!
Цитата · Личное сообщение · #4

yoda31

Можно так... из ресурсов загружать
Code:
  1. LoadResourceFont proc uses ebx ecx edx esi edi dwResID:dword
  2.  
  3.     local cFonts:dword
  4.  
  5.     mov ebx,FUNC(FindResource,NULL,dwResID,RT_FONT)
  6.     .if ebx
  7.         mov esi,FUNC(LockResource,FUNC(LoadResource,NULL,ebx))
  8.         mov ebx,FUNC(SizeofResource,NULL,ebx)
  9.         mov edi,FUNC(AddFontMemResourceEx,esi,ebx,NULL,addr cFonts)
  10.         .if edi
  11.             return edi
  12.         .endif
  13.     .endif
  14.     return FALSE
  15.  
  16. LoadResourceFont endp

А потом так...

Code:
  1. mov hOkFont,FUNC(CreateFont,32,0,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_TT_ONLY_PRECIS,0,ANTIALIASED_QUALITY,0,chr$("BauhausStd-Bold"))


И полученный хендл использовать для SendMessageA (WM_SETFONT)

Ранг: 1.2 (гость)
Статус: Участник

Создано: 17 марта 2020 22:54 New!
Цитата · Личное сообщение · #5

Спасибо большое, очень помогли!

Если кто-то попадет в такую же ситуацию (вариант рабочей программы):
Code:
  1. .386
  2. .model flat, stdcall
  3. option casemap: none
  4.  
  5. ;include C:/masm32/include/windows.inc
  6. ;include C:/masm32/include/kernel32.inc
  7. ;include C:/masm32/include/user32.inc
  8.  
  9. include lib.inc ;взял только самое необходимое из вышеперечисленных библиотек и сохранил в собственной
  10.  
  11. include C:/masm32/include/gdi32.inc ;обязательно для CreateFont
  12. includelib C:/masm32/lib/gdi32.lib
  13.  
  14. includelib C:/masm32/lib/user32.lib
  15. includelib C:/masm32/lib/kernel32.lib
  16.  
  17.  
  18. .data
  19.  
  20. hInstance dd ?
  21.  
  22. ClassMainName db 'test',0
  23. WinMainName db 'test ',0 ;
  24.  
  25. labelType db "static",0
  26. btn db "button",0
  27.  
  28. labelText db "Test",0
  29. btnText db "button",0
  30.  
  31. edit db "edit",0
  32.  
  33. hfont dd ?
  34.  
  35. lf LOGFONT <12,7,0,0,0,0,0,0,0,0,0,0,0,'Arial'>                    
  36.  
  37. .const
  38.  
  39. labelId equ 1
  40. editId equ 2
  41. btnId equ 3
  42.  
  43. .code
  44. start:
  45.  
  46. invoke GetModuleHandle, 0
  47. mov hInstance, eax
  48. invoke WinMain, hInstance,0, 0, 1
  49. invoke ExitProcess, 0
  50.  
  51. WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
  52. LOCAL wc:WNDCLASSEX
  53. LOCAL msg:MSG
  54. LOCAL hWnd:HWND
  55.  
  56.     mov wc.cbSize, SIZEOF WNDCLASSEX
  57.     mov wc.style, CS_HREDRAW or CS_VREDRAW
  58.     mov wc.lpfnWndProc, OFFSET WndProc
  59.     mov wc.cbWndExtra, 0
  60.     mov wc.cbClsExtra,DLGWINDOWEXTRA
  61.     mov wc.hbrBackground,COLOR_BTNFACE+1
  62.     mov wc.lpszMenuName, 0
  63.     mov wc.lpszClassName, OFFSET ClassMainName
  64.     invoke LoadIcon, 0, IDI_APPLICATION
  65.     mov wc.hIcon, eax
  66.     mov wc.hIconSm, eax
  67.     invoke LoadCursor, 0, IDC_ARROW
  68.     mov wc.hCursor, eax
  69.     invoke RegisterClassEx, addr wc
  70.  
  71.     INVOKE CreateWindowEx,0,addr ClassMainName,addr WinMainName,\
  72.     WS_OVERLAPPEDWINDOW-WS_SIZEBOX-WS_MAXIMIZEBOX,CW_USEDEFAULT,\
  73.     CW_USEDEFAULT,400,200,0,0,\
  74.     hInst,0
  75.  
  76.     mov hWnd, eax
  77.  
  78.     invoke ShowWindow, hWnd,1
  79.     invoke UpdateWindow, hWnd
  80.  
  81.     .while TRUE
  82.         invoke GetMessage, addr msg, 0, 0, 0
  83.         .break .if(!eax)
  84.         invoke TranslateMessage, addr msg
  85.         invoke DispatchMessage, addr msg
  86.     .endw
  87.     mov eax, msg.wParam
  88.     ret
  89. WinMain endp
  90.  
  91. WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
  92. ;mov eax, uMsg
  93.  
  94. push esi
  95. push edi
  96. push ebx
  97.  
  98. .IF uMsg==WM_CREATE   
  99.  
  100.     invoke CreateFontIndirectA,addr lf
  101.     mov hfont,eax
  102.  
  103.     invoke CreateWindowEx, 0,addr labelType,addr labelText,WS_CHILD or WS_VISIBLE ,12, 5, 200, 15, hWnd, labelId,hInstance, 0 
  104.     invoke SendMessageA,eax,WM_SETFONT,hfont,1
  105.     
  106.     invoke CreateWindowEx,WS_EX_CLIENTEDGE, addr edit,0,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,12,25,200,25,hWnd,editId,hInstance,0
  107.     invoke SendMessageA,eax,WM_SETFONT,hfont,1
  108.  
  109.     invoke CreateWindowEx,WS_EX_LTRREADING,addr btn,addr btnText,WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,12,55,80,25,hWnd,btnId,hInstance,0
  110.     invoke SendMessageA,eax,WM_SETFONT,hfont,1
  111.  
  112. .ELSEIF uMsg==WM_COMMAND
  113.  
  114. .ELSEIF uMsg==WM_DESTROY
  115. invoke PostQuitMessage, 0
  116. .ELSE
  117. invoke DefWindowProc, hWnd, uMsg, wParam, lParam
  118. .ENDIF
  119. pop ebx 
  120. pop edi
  121. pop esi
  122. ret
  123. WndProc endp
  124.     
  125. end start


Также оставляю пару-тройку ссылочек (кому то могут показаться полезными):
--> Link <--
--> Link <--
--> Link <--

| Сообщение посчитали полезным: Gideon Vi


Ранг: 412.3 (мудрец)
Статус: Участник

Создано: 26 марта 2020 10:55 · Поправил: dosprog New!
Цитата · Личное сообщение · #6

yoda31 пишет:
Code:
  1.     invoke RegisterClassEx, addr wc


Лучше так:

Code:
  1.     mov eax, hInst
  2.     mov wc.hInstance, eax
  3.     invoke RegisterClassEx, addr wc


Ранг: 256.3 (наставник)
Статус: Участник

Создано: 26 марта 2020 11:05 New!
Цитата · Личное сообщение · #7

dosprog пишет:
Лучше так

А зачем, если при создании экземпляра этого класса база модуля (для чего бы она там ни была нужна) указывается?

Ранг: 412.3 (мудрец)
Статус: Участник

Создано: 26 марта 2020 12:50 · Поправил: dosprog New!
Цитата · Личное сообщение · #8

f13nd пишет:
А зачем, если при создании экземпляра этого класса база модуля (для чего бы она там ни была нужна) указывается?

Ну, вот я её и указал, добавленными инструкциями.
Недоинициализированная как положено структура класса
приводит к тому, что далее CreateWindowEx() хотя и отрабатывает нормально в Win7x64,
но завершается с ошибкой под WinXP.
И поскольку в этом сэмпле нет проверки на успешность CreateWindowEx(),
то программка дальше тупо висит в памяти, не выводя никакого окна.

--Добавлено--
Кстати, это не впервые замечено, что неаккуратно написанные программки
хотя и работают в Win7[+], но оказываются неработающими или бажными в WinXP[-].

 eXeL@B —› Вопросы новичков —› Masm winapi font

Видеокурс ВЗЛОМ