Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Common Control'ы (Проблема с назначением шрифта)


Автор: cdman 10.12.2010, 21:05
Люди, всем привет !
 Я не могу разобраться со строкой редактирования, слабовато понимаю, пошаговые действия с назначением какого-нибудь шрифта, например Comic sans (Нужен высотой в 20 пикселей).
Подскажите пожалуйста, какие функции WIN API использовать. Могу бросить текст. Но пока не буду. Может вы что-нибудь предложите?

Автор: 586 11.12.2010, 00:06
Цитата(cdman @  10.12.2010,  21:05 Найти цитируемый пост)
Подскажите пожалуйста, какие функции WIN API использовать.

CreateFontIndirect и SendMessage(WM_SETFONT).

Автор: cdman 11.12.2010, 00:16
Edit Line делается CreateWindowEx .
Потом нужно GetDC ? Контекст нужен для задания шрифта ?

Может функцией GetTextExtentPoint32 как-то можно ?

The GetTextExtentPoint32 function computes the width and height of the specified string of text.
http://msdn.microsoft.com/en-us/library/dd144938
Огромное спасибо за ответы.

Автор: cdman 11.12.2010, 17:04
Вот накатал это, но текст в строку редактирования не пишется вообще. Что может быть ?

    .686P
    .model flat,stdcall
    option casemap:none
    include C:\masm32\include\windows.inc
    include C:\masm32\include\user32.inc
    include C:\masm32\include\kernel32.inc
    include C:\masm32\include\gdi32.inc
    include C:\masm32\include\comdlg32.inc
    include C:\masm32\include\shell32.inc
    include I:\mbuilder\baumanets\baumanets.inc
    includelib C:\masm32\lib\user32.lib
    includelib C:\masm32\lib\kernel32.lib
    includelib C:\masm32\lib\gdi32.lib
    includelib C:\masm32\lib\comdlg32.lib
    includelib C:\masm32\lib\shell32.lib
    includelib I:\mbuilder\baumanets\baumanets.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
TickerID        equ 1
.data?
hwndTicker        HWND ?
hInstance        HINSTANCE ?
CommandLine        LPSTR ?
hFont            dd 0
.data
TextTicker        db "Ticker",0
;_______________
ClassName        db "mbuilder",0
BtnClName        db "button",0
StatClName        db "static",0
EditClName        db "edit",0
LboxClName        db "listbox",0
CboxClName        db "combobox",0
ReditClName        db "richedit",0
RichEditLib        db "riched32.dll",0
FormCaption        db "Form",0
lpFontName1        db "Comic Sans MS",0
TestString        db "TATB",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,2062,452,384,291,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
    LOCAL hdc:HDC
    LOCAL ps:PAINTSTRUCT

    .IF uMsg == WM_DESTROY
        invoke    PostQuitMessage,NULL
    .ELSEIF uMsg == WM_CREATE
    
    invoke    BeginPaint,hWnd, ADDR ps
    mov        hdc,eax
    invoke    CreateFontA,18,0,0,0,FW_BOLD,0,0,0, 1,64,0,2,0 + 0, offset [lpFontName1]
    mov        hFont,eax
    invoke    CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR TextTicker,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,48,32,121,48,hWnd,TickerID,hInstance,0
    mov        hwndTicker,eax
    invoke    SendMessage, hwndTicker, WM_SETFONT, hFont, 0
    invoke    SelectObject, hdc, eax
    mov        hFont,eax
    RGB        200,200,50
    invoke    SetTextColor,hdc,eax
    RGB        0,0,255
    invoke    SetBkColor,hdc,eax
    invoke    TextOut,hdc,0,0,ADDR TestString,SIZEOF TestString
    invoke    SelectObject,hdc, hFont
    invoke    EndPaint,hWnd, ADDR ps
    
    .ELSE
        invoke    DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .ENDIF
    xor        eax,eax
    ret
WndProc endp
end startdPaint,hWnd, ADDR ps

Автор: 586 11.12.2010, 18:36
Это из какого места программы кусок?

Автор: cdman 11.12.2010, 18:53
 Делаю журнал трейдера (Под себя), раньше много программил под DOS, писал архиваторы, игрушки простенькие (Тетрис, Lines). Под винду пока ещё немного не привычно.
У Тебя есть Скайп ? Мой cdman__x . Добавляйся потрещим.

Автор: 586 11.12.2010, 19:16
В коде содержатся ещё и другие ошибки:
Ошибка 1:
Цитата(cdman @  11.12.2010,  17:04 Найти цитируемый пост)
    invoke    GetCommandLine
    invoke    WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT

Между этими строками пропущено mov CommandLine, eax
Ошибка 2:
Структура WNDCLASSEX заполняется не полностью (не инициализирован wc.lpszMenuName).

Код
    .686P
    .model flat,stdcall
    option casemap:none
    include windows.inc
    include user32.inc
    include kernel32.inc
    include gdi32.inc
    include comdlg32.inc
    include shell32.inc
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
TickerID        equ 1
.data?
hwndTicker        HWND ?
hInstance        HINSTANCE ?
CommandLine        LPSTR ?
hFont            dd ?
hBrushBk         dd ?
.data
TextTicker        db "Ticker",0
;_______________
ClassName        db "mbuilder",0
BtnClName        db "button",0
StatClName        db "static",0
EditClName        db "edit",0
LboxClName        db "listbox",0
CboxClName        db "combobox",0
ReditClName        db "richedit",0
RichEditLib        db "riched32.dll",0
FormCaption        db "Form",0
lpFontName1        db "Comic Sans MS",0
TestString        db "TATB",0


;_______________
.code
start:
    invoke    GetModuleHandle,NULL
    mov        hInstance,eax
    invoke    GetCommandLine
    mov CommandLine, eax
    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
    mov wc.lpszMenuName, 0
    invoke    RegisterClassEx,addr wc
invoke CreateWindowEx,0,ADDR ClassName,ADDR FormCaption,WS_SYSMENU or WS_SIZEBOX,200,200,384,291,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
    LOCAL hdc:HDC
    LOCAL ps:PAINTSTRUCT

    .IF uMsg == WM_DESTROY
        invoke DeleteObject, hFont
        invoke DeleteObject, hBrushBk
        invoke    PostQuitMessage,NULL
    .ELSEIF uMsg == WM_CREATE
     invoke    CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR TextTicker,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,48,32,121,48,hWnd,TickerID,hInstance,0
     mov        hwndTicker,eax
     invoke    CreateFontA,18,0,0,0,FW_BOLD,0,0,0, 1,64,0,2,0 + 0, offset [lpFontName1]
     mov        hFont,eax
     invoke    SendMessage, hwndTicker, WM_SETFONT, hFont, 0

     RGB 0,0,255
     invoke CreateSolidBrush, eax
     mov hBrushBk, eax

    .ELSEIF uMsg == WM_CTLCOLOREDIT
     RGB        200,200,50
     invoke    SetTextColor,wParam,eax
     RGB        0,0,255
     invoke    SetBkColor,wParam,eax

     mov eax, hBrushBk
     ret
    .ELSE
        invoke    DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .ENDIF
    xor        eax,eax
    ret
WndProc endp
end start


Автор: cdman 11.12.2010, 19:42
wc.lpszMenuName относиться к ресурсам, я пока в такие дебри не лез. Его обязательно задавать ?

Добавляйся.

Автор: 586 11.12.2010, 20:00
Цитата(cdman @  11.12.2010,  19:42 Найти цитируемый пост)
wc.lpszMenuName относиться к ресурсам, я пока в такие дебри не лез. Его обязательно задавать ?

Я уже исправил это в коде. Посмотри два исходника с сравни.

Автор: cdman 11.12.2010, 20:06
Сейчас разберу, спасибо за поддержку !

Автор: cdman 12.12.2010, 12:21
Привет 586, программил всю ночь, сделал несколько едитов, и оказалось что, цвет фона и шрифта проблематично присвоить качдому элементу. И ещё непонятно,  порядок Ифов и Елсов ... Можно ли обойтись без WM_CTLCOLOREDIT. Использовать на прорисовку, освежение и изменение свойств элементов только WM_PAINT ? Сложно ...
Надо научиться менять: Цвет фона Edit'а, цвет фона шрифта и цвет шрифта - всего 3 параметра. Вот тут начали обсуждать, но никуда не пришли http://forum.sources.ru/index.php?showtopic=74628

WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    LOCAL hdc:HDC
    LOCAL ps:PAINTSTRUCT

.IF uMsg == WM_DESTROY
.
.

.ELSEIF uMsg == WM_CREATE
.
.
.
.ELSEIF uMsg == WM_CTLCOLOREDIT
.
.
.
.ELSEIF uMsg == WM_PAINT

    .ELSEIF uMsg == WM_COMMAND
        mov    eax,wParam
        .IF lParam != 0
            .IF ax == AddDealID
                shr eax,16
                .IF ax == BN_CLICKED
                    invoke    MessageBox,hWnd,addr TextAddDeal,0,MB_ICONINFORMATION
                .ENDIF
            .ELSEIF ax == AllTradesID
                shr eax,16
                .IF ax == BN_CLICKED
                    invoke    MessageBox,hWnd,addr TextAllTrades,0,MB_ICONINFORMATION
                .ENDIF
            .ENDIF
        .ENDIF
        ret
    .ELSE

invoke DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .ENDIF
        xor        eax,eax
        ret

Вот что-то к этому :  SetDCBrushColor    Устанавливает в текущем контексте  устройства (DC) цвет кисти в заданный код цвета. 
                                   SetDCPenColor    Устанавливает цвет пера в текущем контексте устройства (DC)  в заданный код цвета. 

Автор: 500mhz 12.12.2010, 19:00
господа вам не кажется что мы в 2010 (почти в 2011) и все что выше понаписано можно сделать в редакторе ресурсов?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)