Ситуация такая. На форме создаю "SysTabControl32", на закладке рисую рамку "DrawEdge". При событии "WM_PAINT" пытаюсь все перерисовать и вот что получается: Если в событии ничего не делать с закладкой все нормально растягисвается по форме и т. д, но рамки соответственно нет. Если вставить BeginPaint ... EndPaint и указать хендл "SysTabControl32" рамка перерисовывается нормально но сам "SysTabControl32" теряет форму, если указать хендл главного окна, нормально перерисовывается "SysTabControl32", но рамка при это вообще не отображается. Подскажите как правильно перерисовывать? Код (Text): WMPaint: lea eax, Ps push eax push hMainWindow call BeginPaint mov hDC, eax lea eax, rct push eax push hTabControl call GetClientRect add rct.left, 3 add rct.top, 23 sub rct.right, 3 sub rct.bottom, 3 push BF_RECT push EDGE_ETCHED lea eax, rct push eax push hDC call DrawEdge lea eax, Ps push eax push hMainWindow call EndPaint
1) Ты не вызываешь стандартный код отрисовки. То есть Код (Text): CallWindowProc(GetWindowLong(hTabControl,GWL_WNDPROC),hTabControl,WM_PAINT,0,0); 2) hDC можно узнать при создании окна, тогда BeginPaint будет не нужен. А EndPaint замени на ValidateRect.
Попробывал поэксперементировать с "CallWindowProc", "GetWindowLong" ситуация не изменилась. Пробывал и до отрисовки рамки и после. Насколько я понял "ValidateRect" не обязательно хоть и лучше вариант. Сначало отресую что бы работало, потом код улучшу. Код (Text): lea eax, Ps push eax push hTabControl call BeginPaint mov hDC, eax lea eax, rct push eax push hTabControl call GetClientRect add rct.left, 3 add rct.top, 23 sub rct.right, 3 sub rct.bottom, 3 push BF_RECT push EDGE_ETCHED lea eax, rct push eax push hDC call DrawEdge lea eax, Ps push eax push hTabControl call EndPaint push GWL_WNDPROC push hTabControl call GetWindowLong push 0 push 0 push WM_PAINT push hTabControl push eax call CallWindowProc
Вот рабочий пример на FASM`е Код (Text): format PE GUI 4.0 entry start include 'windows.inc' section '' code readable writeable start: xor esi,esi invoke CreateWindowEx,esi,class_static,esi,WS_VISIBLE+WS_OVERLAPPEDWINDOW,esi,esi,200,200,esi,esi,esi,esi push esi push esi push esi push eax invoke SetWindowLong,eax,GWL_WNDPROC,wndproc invoke CreateWindowEx,esi,class_SysTabControl32,esi,WS_VISIBLE+WS_CHILD,0,0,192,168 push tabproc push GWL_WNDPROC push eax invoke GetDC,eax mov [DC],eax call [SetWindowLong] mov [defTabProc],eax @@:invoke GetMessage,msg,esi,esi,esi invoke DispatchMessage,msg jmp @b call [InitCommonControls] proc wndproc wnd,msg,wparam,lparam cmp [msg],WM_CLOSE jne @f invoke ExitProcess,esi @@: invoke DefWindowProc,[wnd],[msg],[wparam],[lparam] ret endp proc tabproc wnd,msg,wparam,lparam cmp [msg],WM_PAINT jne @f invoke CallWindowProc,[defTabProc],[wnd],[msg],[wparam],[lparam] invoke DrawEdge,[DC],rect,EDGE_ETCHED,BF_RECT invoke ValidateRect,[wnd],0 ret @@: invoke CallWindowProc,[defTabProc],[wnd],[msg],[wparam],[lparam] ret endp class_static db 'STATIC',0 class_SysTabControl32 db 'SysTabControl32',0 msg MSG rect RECT 10,10,182,158 DC rd 1 defTabProc rd 1 section '' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL',\ comctl,'COMCTL32.DLL' import kernel,\ ExitProcess,'ExitProcess' import user,\ CreateWindowEx,'CreateWindowExA',\ GetMessage,'GetMessageA',\ DispatchMessage,'DispatchMessageA',\ GetDC,'GetDC',\ SetWindowLong,'SetWindowLongA',\ CallWindowProc,'CallWindowProcA',\ DefWindowProc,'DefWindowProcA',\ ValidateRect,'ValidateRect',\ DrawEdge,'DrawEdge' import comctl,\ InitCommonControls,'InitCommonControls'
rza Работать то будет и без ValidateRect (вместо BeginPaint/EndPaint), только посмотри на загрузку процессора ValidateRect нужна чтобы уже отработанный WM_PAINT не приходил снова и снова и снова до бесконечности.