当前位置: 代码迷 >> PB >> PBGUI,该如何解决
  详细解决方案

PBGUI,该如何解决

热度:87   发布时间:2016-04-29 06:15:50.0
PBGUI
pb12里面有个Advanced GUI,里面要用到canvas.pbx,大部分用户对象都是继承这个外部用户对象,请问这个外部对象实现的是什么功能,以后的程序都继承这个会不会不稳定?
------解决方案--------------------
你看原代码不能知道了吧。

主要是屏蔽了几个消息而已,按我说的方法,也可以不用canvas.pbx
把下面的setnewproc导出,在PB中使用。

#include <windows.h>
WNDPROC userproc;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_ERASEBKGND:
return 1;
}
if (!userproc==NULL)
return (LONG) CallWindowProc(userproc, hwnd, uMsg, wParam, lParam);
else
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
void WINAPI setnewproc(HWND hwnd)
{
userproc=(WNDPROC) SetWindowLong(hwnd, GWL_WNDPROC, (LONG) WindowProc);
return;
}

然后u_canvas改成:


forward
global type u_canvas from userobject
end type
end forward

global type u_canvas from userobject
integer width = 809
integer height = 604
event pbe_paint pbm_paint
event type integer onpaint ( unsignedlong hdc )
end type
global u_canvas u_canvas

type prototypes
FUNCTION boolean GetClientRect (ulong hWnd, ref RECT lpRect) Library "USER32.DLL" alias for "GetClientRect;Ansi"
FUNCTION ulong CreateCompatibleDC(ulong hDC) LIBRARY "Gdi32.dll"
FUNCTION ulong CreateCompatibleBitmap(ulong hDC, int num, int num) LIBRARY "Gdi32.dll"
FUNCTION ulong SelectObject(ulong hdc,ulong hObject) LIBRARY "gdi32.dll"
FUNCTION int BitBlt(ulong hDC, int num, int num, int num, int num, ulong hDC, int num, int num, ulong lParam) LIBRARY "Gdi32.dll"
FUNCTION ulong DeleteObject(ulong hObject) LIBRARY "gdi32.dll"
FUNCTION int DeleteDC(ulong hDC) LIBRARY "Gdi32.dll"
FUNCTION long GetDC (ulong hWnd) Library "USER32.DLL"
FUNCTION Ulong BeginPaint(long hwnd, ref PAINTSTRUCT pstr) Library "USER32.DLL" alias for "BeginPaint;Ansi" 
FUNCTION Boolean EndPaint(long hwnd, ref PAINTSTRUCT pstr) Library "USER32.DLL" alias for "EndPaint;Ansi" 
SUBROUTINE setnewproc(ulong hwnd) library "newproc.dll"
end prototypes

type variables
CONSTANT ulong CS_GLOBALCLASS = 16384
CONSTANT ulong CS_DBLCLKS = 8
private:
ulong thishdc,thishwnd
end variables

event pbe_paint;IF NOT THIS.Visible THEN
RETURN 1
END IF
RECT rc
ulong lmemdc,hmembmp, oldbmp
GetClientRect(thishwnd, rc)
lmemdc = CreateCompatibleDC(thishdc)
hmembmp = CreateCompatibleBitmap(thishdc, rc.right - rc.left, rc.bottom - rc.top);
oldbmp = SelectObject(lmemdc, hmembmp)
event onpaint(lmemdc)
BitBlt(thishdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, lmemdc, 0, 0, 13369376)
SelectObject(lmemdc, oldbmp)
DeleteObject(hmembmp)
DeleteDC(lmemdc)
end event

on u_canvas.create
end on

on u_canvas.destroy
end on

event constructor;thishwnd=handle(this)
thishdc=getdc(thishwnd)
setnewproc(thishwnd)
end event



------解决方案--------------------
你了解一下pbni就知道了~~
------解决方案--------------------
屏WM_ERASEBKGND的作用:
窗口重绘的时候,背景会刷一次,再加上代码中对客户区的重绘,叠在一起就会形成闪烁。
canvas.pbx实际上就是防闪的一种做法

global type paintstruct from structure
ulong hdc
boolean ferase
rect rcpaint
boolean frestore
boolean fincupdate
character rgbreserved[32]
end type