commitmonitor Code
Monitor your SVN repositories and notifies you on new commits
Brought to you by:
steveking
--- a +++ b/trunk/src/BaseWindow.cpp @@ -0,0 +1,146 @@ +// TortoiseIDiff - an image diff viewer in TortoiseSVN + +// Copyright (C) 2006 - 2007 - Stefan Kueng + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +#include "stdafx.h" +#include "BaseWindow.h" + + +ResString::ResString (HINSTANCE hInst, int resId) +{ + if (!::LoadString (hInst, resId, _buf, MAX_RESSTRING + 1)) + { + ZeroMemory(_buf, sizeof(_buf)); + } +} + + +bool CWindow::RegisterWindow(UINT style, HICON hIcon, HCURSOR hCursor, HBRUSH hbrBackground, + LPCTSTR lpszMenuName, LPCTSTR lpszClassName, HICON hIconSm) +{ + WNDCLASSEX wcx; + + // Fill in the window class structure with default parameters + + wcx.cbSize = sizeof(WNDCLASSEX); // size of structure + wcx.style = style; // redraw if size changes + wcx.lpfnWndProc = CWindow::stWinMsgHandler; // points to window procedure + wcx.cbClsExtra = 0; // no extra class memory + wcx.cbWndExtra = 0; // no extra window memory + wcx.hInstance = hResource; // handle to instance + wcx.hIcon = hIcon; // predefined app. icon + wcx.hCursor = hCursor; // predefined arrow + wcx.hbrBackground = hbrBackground; // white background brush + wcx.lpszMenuName = lpszMenuName; // name of menu resource + wcx.lpszClassName = lpszClassName; // name of window class + wcx.hIconSm = hIconSm; // small class icon + + // Register the window class. + return RegisterWindow(&wcx); +} + +bool CWindow::RegisterWindow(CONST WNDCLASSEX* wcx) +{ + // Register the window class. + sClassName = std::wstring(wcx->lpszClassName); + + if (RegisterClassEx(wcx) == 0) + return FALSE; + else + return TRUE; +} + +LRESULT CALLBACK CWindow::stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + CWindow* pWnd; + + if (uMsg == WM_NCCREATE) + { + // get the pointer to the window from lpCreateParams which was set in CreateWindow + SetWindowLongPtr(hwnd, GWLP_USERDATA, (long)((LPCREATESTRUCT(lParam))->lpCreateParams)); + } + + // get the pointer to the window + pWnd = GetObjectFromWindow(hwnd); + + // if we have the pointer, go to the message handler of the window + // else, use DefWindowProc + if (pWnd) + return pWnd->WinMsgHandler(hwnd, uMsg, wParam, lParam); + else + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +bool CWindow::Create() +{ + // Create the window + RECT rect; + + rect.top = 0; + rect.left = 0; + rect.right = 600; + rect.bottom = 400; + + return Create(WS_OVERLAPPEDWINDOW | WS_VISIBLE, NULL, &rect); +} + +bool CWindow::Create(DWORD dwStyles, HWND hParent /* = NULL */, RECT* rect /* = NULL */) +{ + return CreateEx(0, dwStyles, hParent, rect); +} + +bool CWindow::CreateEx(DWORD dwExStyles, DWORD dwStyles, HWND hParent /* = NULL */, RECT* rect /* = NULL */) +{ + // send the this pointer as the window creation parameter + if (rect == NULL) + m_hwnd = CreateWindowEx(dwExStyles, sClassName.c_str(), sWindowTitle.c_str(), dwStyles, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hParent, NULL, hResource, (void *)this); + else + { + m_hwnd = CreateWindowEx(dwExStyles, sClassName.c_str(), sWindowTitle.c_str(), dwStyles, rect->left, rect->top, + rect->right - rect->left, rect->bottom - rect->top, hParent, NULL, hResource, + (void *)this); + } + return (m_hwnd != NULL); +} + +void CWindow::SetTransparency(BYTE alpha, COLORREF color /* = 0xFF000000 */) +{ + if (alpha == 255) + { + LONG exstyle = GetWindowLongPtr(*this, GWL_EXSTYLE); + exstyle &= ~WS_EX_LAYERED; + SetWindowLongPtr(*this, GWL_EXSTYLE, exstyle); + } + else + { + LONG exstyle = GetWindowLongPtr(*this, GWL_EXSTYLE); + exstyle |= WS_EX_LAYERED; + SetWindowLongPtr(*this, GWL_EXSTYLE, exstyle); + } + COLORREF col = color; + DWORD flags = LWA_ALPHA; + if (col & 0xFF000000) + { + col = RGB(255, 255, 255); + flags = LWA_ALPHA; + } + else + { + flags = LWA_COLORKEY; + } + SetLayeredWindowAttributes(*this, col, alpha, flags); +} \ No newline at end of file