I use the following in my AtomZ puzzle game (
http://homepages.nildram.co.uk/~nickk) to sub-class the window :
wpOrigEditProc = (WNDPROC) SetWindowLong(g_pGlob->hWnd,
GWL_WNDPROC, (LONG) EditSubclassProc);
With EditSubclassProc handling all the Windows messages
LRESULT APIENTRY EditSubclassProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg) {
case WM_NCHITTEST : {
register int x = LOWORD(lParam);
register int y = HIWORD(lParam);
RECT wr;
GetWindowRect(hwnd, &wr);
x -= wr.left;
y -= wr.top;
if (y <= GetSystemMetrics(SM_CYFRAME))
{
if (dbSpriteVisible(loadData[INDEX_POINTER].idNum))
{
dbHideSprite(loadData[INDEX_POINTER].idNum);
dbShowMouse();
}
}
else
if (y <= (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYSIZE)))
{
if (x >= 6 && x <= 19 && y >= 6 && y <= 19)
{
if (dbSpriteVisible(loadData[INDEX_POINTER].idNum))
{
dbHideSprite(loadData[INDEX_POINTER].idNum);
dbShowMouse();
} //return HTCLOSE;
}
else
{
if (dbSpriteVisible(loadData[INDEX_POINTER].idNum))
{
dbHideSprite(loadData[INDEX_POINTER].idNum);
dbShowMouse();
}
//return HTCAPTION;
}
}
else
if (x <= GetSystemMetrics(SM_CXFRAME))
{
if (dbSpriteVisible(loadData[INDEX_POINTER].idNum))
{
dbHideSprite(loadData[INDEX_POINTER].idNum);
dbShowMouse();
}
//return HTLEFT;
}
else
if (x >= (wr.right - wr.left - GetSystemMetrics(SM_CXFRAME)))
{
if (dbSpriteVisible(loadData[INDEX_POINTER].idNum))
{
dbHideSprite(loadData[INDEX_POINTER].idNum);
dbShowMouse();
}
//return HTRIGHT;
}
else
if (y >= (wr.bottom - wr.top - GetSystemMetrics(SM_CYFRAME)))
{
dbHideSprite(loadData[INDEX_POINTER].idNum);
dbShowMouse();
// return HTBOTTOM;
}
else
{
if (dbSpriteVisible(loadData[INDEX_POINTER].idNum)==0)
{
dbShowSprite(loadData[INDEX_POINTER].idNum);
MOVEPOINTER();
dbHideMouse();
dbSync();
}
}
}
break;
};
return CallWindowProc(wpOrigEditProc, hwnd, uMsg,
wParam, lParam);