void OpenGLRenderer::Finalize() { HDC hdc = GetDC ( static_cast<HWND> ( mWindowId ) ); wglMakeCurrent ( hdc, static_cast<HGLRC> ( mOpenGLContext ) ); OPENGL_CHECK_ERROR_NO_THROW; ATOM atom = GetClassWord ( static_cast<HWND> ( mWindowId ), GCW_ATOM ); wglMakeCurrent ( hdc, nullptr ); wglDeleteContext ( static_cast<HGLRC> ( mOpenGLContext ) ); mOpenGLContext = nullptr; ReleaseDC ( static_cast<HWND> ( mWindowId ), hdc ); DestroyWindow ( static_cast<HWND> ( mWindowId ) ); UnregisterClass ( reinterpret_cast<LPCSTR> ( #if defined(_M_X64) || defined(__amd64__) 0x0ULL + #endif MAKELONG ( atom, 0 ) ), nullptr ); }
BOOL PEXPORT kpc_set_window_background(ATOMID idWindow, HWND hWnd, float fRed, float fGreen, float fBlue) { short sRed = 0, sGreen = 0, sBlue = 0; if (hWnd == (HWND) -1 || hWnd == KpphWndTraceCB() || hWnd == KpphWndKALCB()) return FALSE; check_and_set_color(&sRed, &fRed); check_and_set_color(&sGreen, &fGreen); check_and_set_color(&sBlue, &fBlue); if (KpsIsASessionWindow(hWnd)) { LISTID idBack = KppMakeList(0); KppAppendElem(idBack, KappaMakeInt(sRed)); KppAppendElem(idBack, KappaMakeInt(sGreen)); KppAppendElem(idBack, KappaMakeInt(sBlue)); KppSetSlotValue(idWindow, lpSNs->idTextBackColorSN, idBack, EXPLIST); } else { HBRUSH hOldBrush = GetClassWord(hWnd, GCW_HBRBACKGROUND); short sOffset = KpsGetWindowOffset(hWnd); SetClassWord(hWnd, GCW_HBRBACKGROUND, CreateSolidBrush(RGB(sRed, sGreen, sBlue))); if (sOffset == -1) return FALSE; if (!bWinBackground[sOffset]) bWinBackground[sOffset] = 1; else if (hOldBrush) DeleteObject(hOldBrush); } InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd); return TRUE; }
HWND WINAPI CreateWindow(LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) { HWND hWndTopLevelAncestor; DWORD dwExStyle = 0; ATOM atmClass; if ((dwStyle & WS_CHILD) && IsWindow(hWndParent)) { hWndTopLevelAncestor = GetTopLevelAncestor(hWndParent); atmClass = GetClassWord(hWndTopLevelAncestor,GCW_ATOM); if (atmClass == atmGlobalLookup[LOOKUP_DIALOGCLASS]) dwExStyle = WS_EX_NOPARENTNOTIFY; } return CreateWindowEx(dwExStyle,lpClassName,lpWindowName,dwStyle,X,Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); }
void WINAPI CheckRadioButton(HWND hDlg, int nIDFirst,int nIDLast,int nIDCheckButton) { HWND hWndCheck,hWndTemp; WORD wID; DWORD dwStyle; ATOM atmClassName; if (!(hWndCheck = GetDlgItem(hDlg,nIDCheckButton))) return; hWndTemp = GetNextDlgGroupItem(hDlg,hWndCheck,FALSE); while(hWndTemp && (hWndCheck != hWndTemp)) { wID = GetWindowID(hWndTemp); dwStyle = GetWindowLong(hWndTemp,GWL_STYLE); atmClassName = GetClassWord(hWndTemp,GCW_ATOM); if ((wID >= (WORD)nIDFirst) && (wID <= (WORD)nIDLast) && (atmClassName == atmGlobalLookup[LOOKUP_BUTTON]) && ((LOWORD(dwStyle) == BS_RADIOBUTTON) || (LOWORD(dwStyle) == BS_AUTORADIOBUTTON))) SendMessage(hWndTemp,BM_SETCHECK,FALSE,0); hWndTemp = GetNextDlgGroupItem(hDlg,hWndTemp,FALSE); } SendMessage(hWndCheck,BM_SETCHECK,TRUE,0); }
ULONG FASTCALL WU32GetClassWord(PVDMFRAME pFrame) { ULONG ul, flag; HWND hwnd; INT iOffset; register PGETCLASSWORD16 parg16; GETARGPTR(pFrame, sizeof(GETCLASSWORD16), parg16); // Make sure Win32 didn't change offsets #if (GCL_HBRBACKGROUND != (-10) || GCL_HCURSOR != (-12) || GCL_HICON != (-14) || GCL_HMODULE != (-16) || GCL_CBWNDEXTRA != (-18) || GCL_CBCLSEXTRA != (-20) || GCL_STYLE != (-26)) #error Win16/Win32 class-word constants differ #endif // Make sure the 16-bit app is requesting allowable offsets // (It's just assertion code, so it doesn't have to be pretty! -JTP) iOffset = INT32(parg16->f2); WOW32ASSERT(iOffset >= 0 || iOffset == GCL_HBRBACKGROUND || iOffset == GCL_HCURSOR || iOffset == GCL_HICON || iOffset == GCL_HMODULE || iOffset == GCL_CBWNDEXTRA || iOffset == GCL_CBCLSEXTRA || iOffset == GCL_STYLE || iOffset == GCW_ATOM); hwnd = HWND32(parg16->f1); switch(iOffset) { case GCL_HBRBACKGROUND: ul = GetClassLong(hwnd, iOffset); if (ul > COLOR_ENDCOLORS) ul = GETHBRUSH16(ul); break; case GCL_HCURSOR: ul = GETHCURSOR16((HAND32)GetClassLong(hwnd, iOffset)); break; case GCL_HICON: ul = GETHICON16((HAND32)GetClassLong(hwnd, iOffset)); break; case GCL_HMODULE: ul = GetGCL_HMODULE(hwnd); break; case GCL_CBWNDEXTRA: case GCL_STYLE: ul = GetClassLong(hwnd, iOffset); break; case GCL_CBCLSEXTRA: ul = GetClassLong(hwnd, GCL_CBCLSEXTRA); // verify that this class was registered by WOW // (see GCW_CBCLSEXTRA notes in thunk for RegisterClass()) if(GetClassLong(hwnd, GCL_WNDPROC) & WNDPROC_WOW) { // get the bozo flag iOffset = ul - sizeof(DWORD); flag = GetClassLong(hwnd, iOffset); // if bozo app flag is set, get the value the app saved // otherwise good little apps get cbClsExtra if(flag) { iOffset -= sizeof(DWORD); ul = GetClassWord(hwnd, iOffset); } else { ul -= (2 * sizeof(DWORD)); // account for our WOW DWORDs } } break; default: ul = GetClassWord(hwnd, iOffset); break; } FREEARGPTR(parg16); RETURN(ul); }
LRESULT WINAPI SendMessage(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) { #ifdef STRICT WNDPROC lpfnWndProc; #else FARPROC lpfnWndProc; #endif DWORD rc; BOOL cInSendMessage; MSG msg; HWND32 hWnd32; #ifdef DEBUG memset((LPSTR)&msg,'\0',sizeof(MSG)); #endif if(hWnd == HWND_BROADCAST) { msg.message = wMsg; msg.wParam = wParam; msg.lParam = lParam; /*send to all top level windows */ return EnumWindows((WNDENUMPROC)MultiSendMsg,(LONG)&msg); } /* * Is this a valid window? */ if (!(hWnd32 = CHECKHWND32(hWnd))) return 0; /* * Does the window have a valid task? */ if (GetWindowTask(hWnd) == 0 || !TWIN_IsLiveTask(GetWindowTask(hWnd))) { RELEASEWININFO(hWnd32); return 0; } /* * Is this window dead? */ if (hWnd32->dwWinFlags & WFDEAD) { RELEASEWININFO(hWnd32); return 0; } /* * Window is a good destination. Intertask send? */ if (hWnd != 0 && GetWindowTask(hWnd) != GetCurrentTask()) { ITSMINFO smse; /* save current InSendMessage Flag */ cInSendMessage = bInSendMessage; /* we are now in sendmessage */ bInSendMessage = TRUE; smse.hSendingTask = GetCurrentTask(); smse.hReceivingTask = GetWindowTask(hWnd); smse.msg.hwnd = hWnd; smse.msg.message = wMsg; smse.msg.wParam = wParam; smse.msg.lParam = lParam; smse.bSendReceived = FALSE; smse.bSendCompleted = FALSE; smse.lpPrev = lpSendMessageStack; lpSendMessageStack = &smse; DirectedYield(smse.hReceivingTask); while (!smse.bSendCompleted) { TWIN_ReceiveMessage(TRUE); } lpSendMessageStack = smse.lpPrev; /* back to what it was before... */ bInSendMessage = cInSendMessage; RELEASEWININFO(hWnd32); return smse.lResult; } if ((lpfnWndProc = #ifdef STRICT (WNDPROC) #else (FARPROC) #endif GetWindowLong(hWnd, GWL_WNDPROC)) == NULL) { ERRSTR((LF_WARNING,"SendMessage: Null wndproc!\n")); RELEASEWININFO(hWnd32); return(0L); } /* save current InSendMessage Flag */ cInSendMessage = bInSendMessage; /* we are now in sendmessage */ bInSendMessage = TRUE; if (lpHookList[WH_CALLWNDPROC+1]) { ATOM atmClassName; HOOKINFO hki; if ((atmClassName = GetClassWord(hWnd,GCW_ATOM)) != atmGlobalLookup[LOOKUP_FRAME]) { hki.hWnd = hWnd; hki.msg = wMsg; hki.wParam = wParam; hki.lParam = lParam; msg.hwnd = hWnd; msg.message = wMsg; msg.wParam = wParam; msg.lParam = lParam; lpHookList[WH_CALLWNDPROC+1]->lpfnHookProc(0,0,(LPARAM)&hki); } } rc = TWIN_CallWindowProc(lpfnWndProc,0,hWnd, wMsg, wParam, lParam); RELEASEWININFO(hWnd32); /* back to what it was before... */ bInSendMessage = cInSendMessage; return rc; }