keks-n писал(а):Похоже, что он её купил.
SUB CLEAR_WINDOW()
#REGISTER NONE
LOCAL i AS LONG
LOCAL pf AS LONG
! mov OS_CLEAR,1
updatewindow hwnd
' ! mov OS_MOROZ,1
FOR i = 0& TO 63&'127
! pushad
! mov ecx,OS_X_Y_4
! mov pf,0&
! shr ecx,2
! sub ecx,4&
loop_c:
! mov eax,LPBIT
! mov edx,pf
! mov ebx,&h04040404
! movd mm1,[eax+edx]
! movd mm2,ebx
! psubusb mm1,mm2
! movd [eax+edx],mm1
! add pf,4&
! loop loop_c
! emms
!popad
DrawDibDraw DDS,HDC,0&,0&,WINDOW_X,WINDOW_Y,AVS,BYVAL LPBIT,0&,0&,MAXX,MAXY-2&,0&
updatewindow hwnd
NEXT i
POKE$ VARPIX, STRING$(XO*YO*4&-4&, $NUL)
updatewindow hwnd
! mov OS_CLEAR,0&
' ! mov OS_MOROZ,0
END SUB
volo писал(а):Глюк указанный выше "разрыв изображения"
...
Проявляется при наличии фонового рисунка на главном DIALOG
и присутствии двух окон CHILD (каждое имеет отдельную CALLBACK). В 7 версии все работает "как часы"
в 8 - фоновый рисунок перекрывает часть одного из CHILD окон, либо закрывает его полностью
т.е. проблема с паразитной прорисовкой фонового рисунка
#COMPILE EXE
#DIM ALL
#INCLUDE "WIN32API.INC"
'
%IDD_DLG = 101
%IDC_TEXTBOX1 = 1001
%IDC_TEXTBOX2 = 1002
$BackgroundBMP="SMTP.bmp" '<- change to yours BMP. I got mine from SMTP example
'
CALLBACK FUNCTION cbTB1()
STATIC t AS STRING
'
FUNCTION=0
'
IF CBCTLMSG= %EN_CHANGE THEN
CONTROL GET TEXT GetParent(CBLPARAM),%IDC_TEXTBOX1 TO t
t=UCASE$(t)
CONTROL SET TEXT GetParent(CBLPARAM),%IDC_TEXTBOX2 , t
FUNCTION=1
END IF
END FUNCTION
'
CALLBACK FUNCTION cbTB2()
STATIC t AS STRING
'
FUNCTION=0
'
IF CBCTLMSG=%EN_CHANGE THEN
CONTROL GET TEXT GetParent(CBLPARAM),%IDC_TEXTBOX2 TO t
t=LCASE$(t)
DIALOG SET TEXT GetParent(CBLPARAM), t
FUNCTION=1
END IF
END FUNCTION
'
CALLBACK FUNCTION cbDLGProc()
STATIC hBmp AS LONG
STATIC x AS LONG
STATIC y AS LONG
STATIC hBmpDC AS LONG
STATIC hWndSaveFocus AS DWORD
'
SELECT CASE AS LONG CBMSG
CASE %WM_INITDIALOG
DIALOG GET CLIENT CBHNDL TO x, y
DIALOG UNITS CBHNDL, x, y TO PIXELS x, y
hBmp = LoadImage(BYVAL %NULL, $BackgroundBMP, %IMAGE_BITMAP, x, y, %LR_LOADFROMFILE)
CASE %WM_NCACTIVATE
IF ISFALSE CBWPARAM THEN
hWndSaveFocus = GetFocus()
ELSEIF hWndSaveFocus THEN
SetFocus(hWndSaveFocus): hWndSaveFocus = 0
END IF
'
CASE %WM_ERASEBKGND
' Select the bitmap into a memory DC and transfer it to the dialog
hBmpDC = CreateCompatibleDC(CBWPARAM)
SelectObject hBmpDC, hBmp
BitBlt CBWPARAM, 0, 0, x, y, hBmpDC, 0, 0, %SRCCOPY
DeleteDC hBmpDC
'
FUNCTION = 1
'
CASE %WM_DESTROY
' The dialog is being destroyed, so release the bitmap handle
DeleteObject hBmp
END SELECT
END FUNCTION
'------------------------------------------------------------------------------------
FUNCTION PBMAIN()
LOCAL hDlg AS DWORD
'
DIALOG NEW %HWND_DESKTOP, "DLG", 123, 73, 192, 78, %WS_POPUP OR %WS_BORDER OR _
%WS_DLGFRAME OR %WS_CAPTION OR %WS_SYSMENU OR %WS_MINIMIZEBOX OR _
%WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_CENTER OR _
%DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_WINDOWEDGE OR _
%WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
%WS_EX_RIGHTSCROLLBAR, TO hDlg
CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX1, "TextBox1", 20, 8, 64, 24, CALL cbTB1
CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX2, "TextBox2", 96, 32, 60, 24, CALL cbTB2
'
DIALOG SHOW MODAL hDlg, CALL cbDLGProc
END FUNCTION
'
jangle писал(а):volo - спасибо за описание глюков 8 версии!
Грустно слышать, что у PB нет будущего, возможно Боб всетаки найдет приемника который будет развивать этот безусловно интересный и необходимый компилятор.
[/img]
PBDN писал(а):volo писал(а):Глюк указанный выше "разрыв изображения"
...
Проявляется при наличии фонового рисунка на главном DIALOG
и присутствии двух окон CHILD (каждое имеет отдельную CALLBACK). В 7 версии все работает "как часы"
в 8 - фоновый рисунок перекрывает часть одного из CHILD окон, либо закрывает его полностью
т.е. проблема с паразитной прорисовкой фонового рисунка
volo,
накидал быстренько сэмпл, чтобы проверить этот глюк, но у меня все нормально прорисовывается, может подправите чтоб глючило ?
проверял на старичке Пень-2 х 300мгц
первоначальная загрузка
DIALOG NEW hdlgy, $TITLEN,,,534&,325&,%DS_3DLOOK OR %WS_POPUPWINDOW OR %WS_BORDER TO hDlgM
CONTROL ADD IMAGEX, hdlgM,%ID_SKINE,"skine" & FORMAT$(parameters.expo_color),0&,0&,0&,0&',%WS_DISABLED
....
обработка событий
....
обработка событий
getwindowrect GetDesktopWindow, re
OS_MAXX = re.nright
OS_MAXY = OS_MAXX * 0.75! '666!
SetWindowRgn hDlgM, %NULL, %TRUE
MoveWindow hdlgM, 0&, 0&,OS_MAXX,OS_MAXY,%TRUE '38
....
обработка событий
DIALOG GET SIZE hdlgM TO x1,y1
CONTROL SET SIZE hdlgM, %ID_SKINE, x1,y1
...
обработка событий (перенос и прорисовка других элементов)
**** МОМЕНТ ГЛЮКА НЕПРОРИСОВКИ. рисунок глюка см. в этой ветке форума выше.
volo писал(а):видимо нить не успевает отработать
закрашивание области, как параллельно начинается прорисовка
элементов диалога
%WM_Private_SetText =%WM_USER+7500
%WM_Private_DrawLine =%WM_USER+7501
...
...
в CALLBACKе основного диалога обработка приватных сообщений
CASE %WM_Private_SetText
LOCAL lpsz as ASCIIZ PTR
lpsz=CBWPARAM
CONTROL SET TEXT CBHNDL, LOWRD(CBLPARAM), @lpsz
SendMessage[PostMessage](hDlg,%WM_Private_SetText,ByVal VARPTR(sString),MAK(DWORD, %IDC_TextBox01, 0) )
PBDN писал(а):Как ни странно, не смотря на дополнительные телодвижения, глюки исчезли.
Т.е. что хотел сказать - все что работает с экраном - только из основного трида.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20