My problem only shows in Windows98SE not in WindowsXPpro (I tested it both in 98SE and XPpro)
When i compile this code in Windows98SE by VC6
it's okay but when I debug >> F5
It shows Error Message look like this
First-chance exception in SkidRow2.exe (GDI32.DLL): 0xC0000005: Access Violation.
Whenever SubclassButtonProc is called, that Err msg show again....... more and more
finally, graphic interface of my Button is disorder
This error cause my code but I dont know how to fix it........ I dont know where is it? where the error in my code?
could you help me to find it
thank you
MyProject(65KB)
=========================================================
<br />
LRESULT CALLBACK SubclassButtonProc(HWND hWndButton, UINT Msg, WPARAM wParam, LPARAM lParam)<br />
{<br />
<br />
static INT fLButtonDown;<br />
static INT fMouseIn;<br />
static INT fDrawMouseOut;<br />
HDC hDC;<br />
<br />
RECT rect; <br />
POINT pt;<br />
<br />
GetCursorPos(&pt);<br />
GetWindowRect(hWndButton, &rect); <br />
<br />
switch(Msg)<br />
{<br />
case WM_LBUTTONDBLCLK: <br />
fMouseIn=1; <br />
goto Work;<br />
case WM_MOUSEMOVE:<br />
if (!PtInRect(&rect,pt))<br />
{<br />
fMouseIn=0;<br />
<br />
if (!fDrawMouseOut)<br />
{<br />
InvalidateRect(hWndButton, NULL, TRUE);<br />
fDrawMouseOut=1;<br />
}<br />
return FALSE;<br />
}<br />
else<br />
fDrawMouseOut=0;<br />
<br />
<br />
if (!fMouseIn)<br />
{ <br />
<br />
fMouseIn=1;<br />
InvalidateRect(hWndButton, NULL, TRUE);<br />
TRACKMOUSEEVENT tme;<br />
tme.cbSize =sizeof(tme);<br />
tme.dwFlags =TME_LEAVE;<br />
tme.dwHoverTime =HOVER_DEFAULT;<br />
tme.hwndTrack =hWndButton;<br />
_TrackMouseEvent(&tme);<br />
return FALSE;<br />
}<br />
return FALSE;<br />
case WM_MOUSELEAVE: <br />
if(fMouseIn) <br />
{<br />
fMouseIn=0; <br />
<br />
InvalidateRect(hWndButton, NULL, TRUE);<br />
return FALSE;<br />
}<br />
InvalidateRect(hWndButton, NULL, TRUE);<br />
return FALSE;<br />
Work:<br />
case WM_LBUTTONDOWN:<br />
SetCapture(hWndButton);<br />
{<br />
HDC hdc;<br />
CHAR buffer[100];<br />
static i;<br />
hdc=GetDC(hWnd);<br />
i++;<br />
sprintf(buffer,"down %d time(s)",i);<br />
TextOut(hdc,0,60,buffer, strlen(buffer));<br />
ReleaseDC(hWnd,hdc);<br />
}<br />
fLButtonDown=1;<br />
InvalidateRect(hWndButton, NULL, TRUE);<br />
return FALSE;<br />
<br />
case WM_LBUTTONUP:<br />
{ <br />
HDC hdc;<br />
CHAR buffer[100];<br />
static i;<br />
hdc=GetDC(hWnd);<br />
i++;<br />
<br />
if (!PtInRect(&rect,pt))<br />
{<br />
sprintf(buffer,"up %d time(s) --- x=%d y=%d out left=%d top=%d right=%d bottom=%d"<br />
,i,pt.x,pt.y,rect.left,rect.top,rect.right,rect.bottom);<br />
fLButtonDown=0;<br />
ReleaseCapture();<br />
return FALSE;<br />
}<br />
else<br />
{<br />
sprintf(buffer,"up %d time(s) --- x=%d y=%d in left=%d top=%d right=%d bottom=%d"<br />
,i,pt.x,pt.y,rect.left,rect.top,rect.right,rect.bottom);<br />
}<br />
<br />
<br />
TextOut(hdc,0,90,buffer, strlen(buffer));<br />
ReleaseDC(hWnd,hdc);<br />
}<br />
fLButtonDown=0; <br />
ReleaseCapture();<br />
InvalidateRect(hWndButton, NULL, TRUE);<br />
<br />
if (TRUE) <br />
{<br />
HDC hdc;<br />
CHAR buffer[100];<br />
static i;<br />
hdc=GetDC(hWnd);<br />
i++;<br />
sprintf(buffer,"push %d time(s)",i);<br />
TextOut(hdc,0,0,buffer, strlen(buffer));<br />
ReleaseDC(hWnd,hdc);<br />
} <br />
return FALSE;<br />
case WM_PAINT:<br />
INT SaveBkMode;<br />
COLORREF SaveTextColor; <br />
HDC hMemDC;<br />
HFONT hSaveFont;<br />
HBITMAP hbmImage, hbmSave;<br />
CHAR szCaption[30];<br />
CHAR cIndex;<br />
WORD xImage, yImage, xText, yText;<br />
SIZE size;<br />
PAINTSTRUCT ps;<br />
RECT rect; <br />
<br />
GetClientRect(hWndButton, &rect);
hDC=BeginPaint(hWndButton, &ps);<br />
<br />
HDC hdc;<br />
CHAR buffer[100];<br />
static i;<br />
hdc=GetDC(hWnd);<br />
i++;<br />
sprintf(buffer,"redraw %d time(s)",i);<br />
TextOut(hdc,0,30,buffer, strlen(buffer));<br />
ReleaseDC(hWnd,hdc);<br />
<br />
hSaveFont=(HFONT)SelectObject(hDC, hFontCaption);<br />
GetWindowText(hWndButton, szCaption, strlen(szCaption));<br />
hbmImage=LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));<br />
<br />
cIndex=0;<br />
<br />
hMemDC=CreateCompatibleDC(NULL);<br />
<br />
BITMAP bm;<br />
GetObject(hbmImage, sizeof(bm), &bm);<br />
<br />
GetTextExtentPoint32(hDC, szCaption, lstrlen(szCaption), &size); <br />
xImage=rect.left+((rect.right-rect.left)-(bm.bmWidth + size.cx +4))/2;<br />
yImage=rect.top+((rect.bottom-rect.top)-bm.bmHeight)/2;<br />
xText=xImage+bm.bmWidth+4;<br />
yText=rect.top+((rect.bottom-rect.top)-size.cy)/2;<br />
SaveBkMode=SetBkMode(hDC, TRANSPARENT);<br />
SaveTextColor=SetTextColor(hDC, RGB(0,0,0));<br />
<br />
hbmSave=(HBITMAP)SelectObject(hMemDC, hbmImage);<br />
if (!fMouseIn)
{<br />
WINDOW::DrawGradientRect(hDC, rect, WCOLOR1, WCOLOR3, 0);<br />
TransparentBlt(hDC, xImage,yImage,bm.bmWidth, bm.bmHeight, hMemDC, 0,0, bm.bmWidth, bm.bmHeight,RGB(255,255,255));<br />
TextOut(hDC, xText, yText, szCaption, strlen(szCaption));<br />
}<br />
else
{<br />
WINDOW::DrawGradientRect(hDC, rect, WCOLOR1,WCOLOR2, 0);<br />
TransparentBlt(hDC, xImage,yImage,bm.bmWidth, bm.bmHeight, hMemDC, 0,0, bm.bmWidth, bm.bmHeight,RGB(255,255,255));<br />
TextOut(hDC, xText, yText, szCaption, strlen(szCaption));<br />
}<br />
<br />
if (fLButtonDown && fMouseIn)
{<br />
WINDOW::DrawGradientRect(hDC, rect, WCOLOR1, WCOLOR2, 0);<br />
rect.left +=2;<br />
rect.top +=2; <br />
TransparentBlt(hDC, xImage+2, yImage+2,bm.bmWidth, bm.bmHeight, hMemDC, 0,0, bm.bmWidth, bm.bmHeight,RGB(255,255,255));<br />
TextOut(hDC, xText+2, yText+2, szCaption, strlen(szCaption));<br />
rect.left -=2;<br />
rect.top -=2; <br />
<br />
DrawEdge(hDC, &rect, EDGE_SUNKEN, BF_RECT); <br />
}<br />
else
{<br />
DrawEdge(hDC, &rect, EDGE_RAISED, BF_RECT); <br />
}<br />
<br />
SetTextColor(hDC, SaveTextColor);<br />
SetBkMode(hDC, SaveBkMode);<br />
SelectObject(hMemDC, hbmSave);<br />
DeleteDC(hMemDC);<br />
SelectObject(hDC, hSaveFont);<br />
DeleteObject(hSaveFont);<br />
DeleteObject(hbmSave); <br />
EndPaint(hWndButton, &ps);<br />
return TRUE;<br />
default: <br />
return CallWindowProc(OriButtonProc, hWndButton, Msg, wParam, lParam); <br />
} <br />
}
|