/***************************************************************************** * * window.cpp * *****************************************************************************/ #include "sdview.h" LRESULT CALLBACK FrameWindow::WndProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { FrameWindow *self; if (uiMsg == WM_NCCREATE) { LPCREATESTRUCT lpcs = RECAST(LPCREATESTRUCT, lParam); self = RECAST(FrameWindow *, lpcs->lpCreateParams); self->_hwnd = hwnd; SetWindowLongPtr(self->_hwnd, GWLP_USERDATA, RECAST(LPARAM, self)); } else { self = RECAST(FrameWindow *, GetWindowLongPtr(hwnd, GWLP_USERDATA)); } if (self) { return self->HandleMessage(uiMsg, wParam, lParam); } else { return DefWindowProc(hwnd, uiMsg, wParam, lParam); } } // // Default message handler. Messages land here after passing through // all the derived classes. // LRESULT FrameWindow::HandleMessage(UINT uiMsg, WPARAM wParam, LPARAM lParam) { switch (uiMsg) { case WM_NCDESTROY: _hwnd = NULL; PostQuitMessage(0); break; case WM_SIZE: if (_hwndChild) { SetWindowPos(_hwndChild, NULL, 0, 0, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), SWP_NOZORDER | SWP_NOACTIVATE); } return 0; case WM_SETFOCUS: if (_hwndChild) { SetFocus(_hwndChild); } return 0; case WM_CLOSE: if (GetKeyState(VK_SHIFT) < 0) { g_lThreads = 1; // force app to exit } break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDM_EXIT: DestroyWindow(_hwnd); break; case IDM_EXITALL: g_lThreads = 1; // force app to exit DestroyWindow(_hwnd); break; } break; case WM_HELP: Help(_hwnd, NULL); break; } return DefWindowProc(_hwnd, uiMsg, wParam, lParam); } #define CLASSNAME TEXT("SD View") HWND FrameWindow::CreateFrameWindow() { WNDCLASS wc; if (!GetClassInfo(g_hinst, CLASSNAME, &wc)) { wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = g_hinst; wc.hIcon = LoadIcon(g_hinst, MAKEINTRESOURCE(IDI_SDV)); wc.hCursor = g_hcurArrow; wc.hbrBackground = RECAST(HBRUSH, COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = CLASSNAME; if (!RegisterClass(&wc)) { return NULL; } } _hwnd = CreateWindow( CLASSNAME, /* Class Name */ NULL, /* Title */ WS_CLIPCHILDREN | WS_VISIBLE | WS_OVERLAPPEDWINDOW, /* Style */ CW_USEDEFAULT, CW_USEDEFAULT, /* Position */ CW_USEDEFAULT, CW_USEDEFAULT, /* Size */ NULL, /* Parent */ NULL, /* No menu */ g_hinst, /* Instance */ this); /* Special parameters */ return _hwnd; } DWORD FrameWindow::RunThread(FrameWindow *self, LPVOID lpParameter) { if (self) { self->_pszQuery = RECAST(LPTSTR, lpParameter); if (self->CreateFrameWindow()) { MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { if (self->_haccel && TranslateAccelerator(self->_hwnd, self->_haccel, &msg)) { } else { TranslateMessage(&msg); DispatchMessage(&msg); } } } delete self; } if (lpParameter) { LocalFree(lpParameter); } return EndThreadTask(0); }