GetTextExtentPoint32 возвращает размер не того шрифта

Тема в разделе "WASM.BEGINNERS", создана пользователем xchg, 21 июл 2007.

  1. xchg

    xchg New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    34
    Адрес:
    Russia
    Добрый день) Бьюсь над одной проблемой уже полдня, не могу понять в чем дело(

    Создаю контрол "Статик", затем создаю шрифт с помощью CreateFont и устанавливаю его сообщением WM_SETFONT.
    Код (Text):
    1. .
    2. if eax==WM_CREATE
    3. invoke     CreateWindowEx,0 , addr StaticClassName, NULL,\
    4. WS_CHILD or WS_VISIBLE ,0,0, 392, 210, hWin,111000, hInstance,0
    5. mov     hSTCToolTip, eax
    6.        
    7. invoke CreateFont,15,0,0,0,500,0,0,0,OEM_CHARSET,\
    8. OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
    9. DRAFT_QUALITY,DEFAULT_PITCH,addr szFontName
    10.  
    11. invoke SendMessage,hSTCToolTip,WM_SETFONT,eax,0
    Потом когда меняю текст в контроле, узнаю размер строки
    Код (Text):
    1. invoke GetDC,hSTCToolTip
    2. mov lhDC,eax
    3. invoke GetTextExtentPoint32,lhDC,addr lToolTipBuffer,lSizeBuffer3,addr FSSize
    4. push FSSize.w
    5. pop lSizeRow1
    Затем ресайзю контрол. Получается размер контрола больше строки,т.е. GetTextExtentPoint32 возвращает размер шрифта, который использовался по умолчанию, до того как я его изменил.
    если закомментировать,
    Код (Text):
    1. invoke SendMessage,hSTCToolTip,WM_SETFONT,eax,0
    то все нормально (размеры контрола и строки). совпадают.
    Спасибо.
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    xchg
    Попробуй
    Код (Text):
    1. ...
    2. invoke CreateFont,15,0,0,0,500,0,0,0,OEM_CHARSET,\
    3. OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
    4. DRAFT_QUALITY,DEFAULT_PITCH,addr szFontName
    5. mov hFont,eax               ;; !!!
    6. invoke SendMessage,hSTCToolTip,WM_SETFONT,eax,0
    7. ...
    8. invoke GetDC,hSTCToolTip
    9. mov lhDC,eax
    10. invoke SelectObject, lhDC, hFont    ;; !!!
    11. mov hOldFont,eax            ;; !!!
    12. invoke GetTextExtentPoint32,lhDC,addr lToolTipBuffer,lSizeBuffer3,addr FSSize
    13. ...
    14. invoke SelectObject, lhDC, hOldFont ;; !!!
    15. ...
     
  3. xchg

    xchg New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    34
    Адрес:
    Russia
    Работает, спасибо q_q.
    Но еще одна проблемка, когда длина строк совпадают они накладываются друг на друга. Где-то здесь я видел решение подобной задчи, но не могу сейчас найти.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    xchg
    Что значит накладываются? Перед выводом новой строки фон не очищается? WM_CTLCOLORSTATIC обрабатываешь как-нибудь?
     
  5. xchg

    xchg New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    34
    Адрес:
    Russia
    WM_CTLCOLORSTATIC обрабатываю так:
    Код (Text):
    1. .elseif eax==WM_CTLCOLORSTATIC
    2. invoke GetDlgCtrlID,lParam
    3. .if eax==111000
    4. invoke SetBkMode,wParam,TRANSPARENT
    5. invoke GetStockObject,NULL_BRUSH
    6. .else
    7. invoke DefWindowProc, hWin, uMsg, wParam,lParam
    8. .endif
    9. ret
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    xchg
    накладываются друг на друга ... WM_CTLCOLORSTATIC обрабатываю так
    Не удивительно, ты предпринял все меры, чтобы предыдущий текст остался. TRANSPARENT влияет на вывод текста, не сплошных (not solid) кистей и линей, заставляя не трогать фон под ними. NULL_BRUSH "запрещает" очищать фон всего static'а.
     
  7. xchg

    xchg New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    34
    Адрес:
    Russia
    Переделал.
    Код (Text):
    1. .elseif eax==WM_CTLCOLORSTATIC
    2. invoke GetDlgCtrlID,lParam
    3. .if eax==111000
    4. RGB 255,255,225
    5. invoke SetBkColor,wParam,еax
    6. invoke GetStockObject,NULL_BRUSH
    7. .else
    8. invoke DefWindowProc, hWin, uMsg, wParam,lParam
    9. .endif
    10. ret
    Вроде работает)