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)