bool CDirectWriteRenderer::Initialize(HWND hwnd) { Finalize(); if (hwnd == nullptr) return false; ID2D1Factory *pFactory = m_System.GetD2DFactory(); if (pFactory == nullptr) return false; D2D1_RENDER_TARGET_PROPERTIES Props = D2D1::RenderTargetProperties( D2D1_RENDER_TARGET_TYPE_DEFAULT, D2D1::PixelFormat( DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE), 96.0f, 96.0f, D2D1_RENDER_TARGET_USAGE_NONE, D2D1_FEATURE_LEVEL_DEFAULT); ID2D1DCRenderTarget *pRenderTarget; HRESULT hr = pFactory->CreateDCRenderTarget(&Props, &pRenderTarget); if (SUCCEEDED(hr)) { m_pRenderTarget = pRenderTarget; m_hwnd = hwnd; OnWindowPosChanged(); } pFactory->Release(); return SUCCEEDED(hr); }
LRESULT CView::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DROPFILES: return OnDropFiles(wParam, lParam); case WM_HSCROLL: return OnHScroll(wParam, lParam); case WM_VSCROLL: return OnVScroll(wParam, lParam); case WM_WINDOWPOSCHANGED: return OnWindowPosChanged(wParam, lParam); } // Pass unhandled messages on for default processing return WndProcDefault(uMsg, wParam, lParam); }
// returns false if message not handled bool CFrameHolder::ProcessNcMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult) { #ifdef _DEBUG if (mb_NcAnimate) { wchar_t szDbg[1024], szMsg[128], szInfo[255]; szInfo[0] = 0; switch (uMsg) { case WM_ERASEBKGND: lstrcpy(szMsg, L"WM_ERASEBKGND"); break; case WM_PAINT: lstrcpy(szMsg, L"WM_PAINT"); break; case WM_NCPAINT: lstrcpy(szMsg, L"WM_NCPAINT"); break; case WM_NCACTIVATE: lstrcpy(szMsg, L"WM_NCACTIVATE"); break; case WM_NCCALCSIZE: lstrcpy(szMsg, L"WM_NCCALCSIZE"); break; case WM_NCHITTEST: lstrcpy(szMsg, L"WM_NCHITTEST"); break; case WM_NCLBUTTONDOWN: lstrcpy(szMsg, L"WM_NCLBUTTONDOWN"); break; case WM_NCMOUSEMOVE: lstrcpy(szMsg, L"WM_NCMOUSEMOVE"); break; case WM_NCMOUSELEAVE: lstrcpy(szMsg, L"WM_NCMOUSELEAVE"); break; case WM_NCMOUSEHOVER: lstrcpy(szMsg, L"WM_NCMOUSEHOVER"); break; case WM_NCLBUTTONDBLCLK: lstrcpy(szMsg, L"WM_NCLBUTTONDBLCLK"); break; case 0xAE: /*WM_NCUAHDRAWCAPTION*/ lstrcpy(szMsg, L"WM_NCUAHDRAWCAPTION"); break; case 0xAF: /*WM_NCUAHDRAWFRAME*/ lstrcpy(szMsg, L"WM_NCUAHDRAWFRAME"); break; case 0x31E: /*WM_DWMCOMPOSITIONCHANGED*/ lstrcpy(szMsg, L"WM_DWMCOMPOSITIONCHANGED"); break; case WM_WINDOWPOSCHANGED: lstrcpy(szMsg, L"WM_WINDOWPOSCHANGED"); break; case WM_SYSCOMMAND: lstrcpy(szMsg, L"WM_SYSCOMMAND"); break; case WM_GETTEXT: lstrcpy(szMsg, L"WM_GETTEXT"); break; case WM_PRINT: lstrcpy(szMsg, L"WM_PRINT"); break; case WM_PRINTCLIENT: lstrcpy(szMsg, L"WM_PRINTCLIENT"); break; case WM_GETMINMAXINFO: lstrcpy(szMsg, L"WM_GETMINMAXINFO"); break; case WM_WINDOWPOSCHANGING: lstrcpy(szMsg, L"WM_WINDOWPOSCHANGING"); break; case WM_MOVE: lstrcpy(szMsg, L"WM_MOVE"); wsprintf(szInfo, L"{%ix%i}", (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam)); break; case WM_SIZE: lstrcpy(szMsg, L"WM_SIZE"); wsprintf(szInfo, L"%s {%ix%i}", (wParam==SIZE_MAXHIDE) ? L"SIZE_MAXHIDE" : (wParam==SIZE_MAXIMIZED) ? L"SIZE_MAXIMIZED" : (wParam==SIZE_MAXSHOW) ? L"SIZE_MAXSHOW" : (wParam==SIZE_MINIMIZED) ? L"SIZE_MINIMIZED" : (wParam==SIZE_RESTORED) ? L"SIZE_RESTORED" : L"???", (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam)); break; default: wsprintf(szMsg, L"%u=x%X", uMsg, uMsg); } wsprintf(szDbg, L"MsgInAnimage(%s, %u, %u%s%s)\n", szMsg, (DWORD)wParam, (DWORD)lParam, szInfo[0] ? L" - " : L"", szInfo); OutputDebugString(szDbg); } #endif bool lbRc; static POINT ptLastNcClick = {}; switch (uMsg) { case WM_ERASEBKGND: DBGFUNCTION(L"WM_ERASEBKGND \n"); lResult = TRUE; return true; //return false; case WM_PAINT: DBGFUNCTION(L"WM_PAINT \n"); lResult = OnPaint(hWnd, FALSE); return true; case WM_NCPAINT: DBGFUNCTION(L"WM_NCPAINT \n"); lResult = OnNcPaint(hWnd, uMsg, wParam, lParam); return true; case WM_NCACTIVATE: DBGFUNCTION(L"WM_NCACTIVATE \n"); lResult = OnNcActivate(hWnd, uMsg, wParam, lParam); return true; case WM_NCCALCSIZE: DBGFUNCTION(L"WM_NCCALCSIZE \n"); lResult = OnNcCalcSize(hWnd, uMsg, wParam, lParam); return true; case WM_NCHITTEST: DBGFUNCTION(L"WM_NCHITTEST \n"); lResult = OnNcHitTest(hWnd, uMsg, wParam, lParam); return true; case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: case WM_NCRBUTTONDOWN: case WM_NCRBUTTONUP: case WM_NCMBUTTONDOWN: case WM_NCMBUTTONUP: case WM_NCMOUSEMOVE: case WM_NCMOUSELEAVE: case WM_NCMOUSEHOVER: #ifdef _DEBUG switch (uMsg) { case WM_NCLBUTTONDOWN: DBGFUNCTION(L"WM_NCLBUTTONDOWN \n"); break; case WM_NCLBUTTONUP: DBGFUNCTION(L"WM_NCLBUTTONUP \n"); break; case WM_NCRBUTTONDOWN: DBGFUNCTION(L"WM_NCRBUTTONDOWN \n"); break; case WM_NCRBUTTONUP: DBGFUNCTION(L"WM_NCRBUTTONUP \n"); break; case WM_NCMBUTTONDOWN: DBGFUNCTION(L"WM_NCMBUTTONDOWN \n"); break; case WM_NCMBUTTONUP: DBGFUNCTION(L"WM_NCMBUTTONUP \n"); break; case WM_NCMOUSEMOVE: DBGFUNCTION(L"WM_NCMOUSEMOVE \n"); break; case WM_NCMOUSELEAVE: DBGFUNCTION(L"WM_NCMOUSELEAVE \n"); break; case WM_NCMOUSEHOVER: DBGFUNCTION(L"WM_NCMOUSEHOVER \n"); break; } #endif ptLastNcClick = MakePoint(LOWORD(lParam),HIWORD(lParam)); if ((uMsg == WM_NCMOUSEMOVE) || (uMsg == WM_NCLBUTTONUP)) gpConEmu->isSizing(); // могло не сброситься, проверим RedrawLock(); lbRc = gpConEmu->mp_TabBar->ProcessTabMouseEvent(hWnd, uMsg, wParam, lParam, lResult); RedrawUnlock(); if (!lbRc) { if ((wParam == HTSYSMENU && uMsg == WM_NCLBUTTONDOWN) /*|| (wParam == HTCAPTION && uMsg == WM_NCRBUTTONDOWN)*/) { //if (uMsg == WM_NCRBUTTONDOWN) // gpConEmu->ShowSysmenu((SHORT)LOWORD(lParam),(SHORT)HIWORD(lParam)); //else DWORD nCurTick = GetTickCount(); DWORD nOpenDelay = nCurTick - gpConEmu->mn_SysMenuOpenTick; DWORD nCloseDelay = nCurTick - gpConEmu->mn_SysMenuCloseTick; DWORD nDoubleTime = GetDoubleClickTime(); if (gpConEmu->mn_SysMenuOpenTick && (nOpenDelay < nDoubleTime)) { PostMessage(ghWnd, WM_SYSCOMMAND, SC_CLOSE, 0); } else if (gpConEmu->mn_SysMenuCloseTick && (nCloseDelay < (nDoubleTime/2))) { // Пропустить - кликом закрыли меню int nDbg = 0; } else { gpConEmu->ShowSysmenu(); } lResult = 0; lbRc = true; } } return lbRc; //case WM_LBUTTONDBLCLK: // { // // Глюк? DblClick по иконке приводит к WM_LBUTTONDBLCLK вместо WM_NCLBUTTONDBLCLK // POINT pt = MakePoint(LOWORD(lParam),HIWORD(lParam)); // if (gpConEmu->PtDiffTest(pt, ptLastNcClick.x, ptLastNcClick.y, 4)) // { // PostMessage(ghWnd, WM_SYSCOMMAND, SC_CLOSE, 0); // lResult = 0; // return true; // } // } // return false; case WM_MOUSEMOVE: DBGFUNCTION(L"WM_MOUSEMOVE \n"); RedrawLock(); if (gpConEmu->mp_TabBar->GetHoverTab() != -1) { gpConEmu->mp_TabBar->HoverTab(-1); } // Ну и с кнопок убрать подсветку, если была gpConEmu->mp_TabBar->Toolbar_UnHover(); RedrawUnlock(); return false; case WM_NCLBUTTONDBLCLK: if (wParam == HTCAPTION) { mb_NcAnimate = TRUE; } if (wParam == HT_CONEMUTAB) { //RedrawLock(); -- чтобы отрисовать "клик" по кнопке lbRc = gpConEmu->mp_TabBar->ProcessTabMouseEvent(hWnd, uMsg, wParam, lParam, lResult); //RedrawUnlock(); } else if (gpConEmu->OnMouse_NCBtnDblClk(hWnd, uMsg, wParam, lParam)) { lResult = 0; // DblClick на рамке - ресайз по ширине/высоте рабочей области экрана } else { lResult = DefWindowProc(hWnd, uMsg, wParam, lParam); } if (wParam == HTCAPTION) { mb_NcAnimate = FALSE; } return true; case WM_KEYDOWN: case WM_KEYUP: if (gpSet->isTabSelf && (wParam == VK_TAB || gpConEmu->mp_TabBar->IsInSwitch())) { if (isPressed(VK_CONTROL) && !isPressed(VK_MENU) && !isPressed(VK_LWIN) && !isPressed(VK_RWIN)) { if (gpConEmu->mp_TabBar->ProcessTabKeyboardEvent(hWnd, uMsg, wParam, lParam, lResult)) { return true; } } } return false; //case WM_NCCREATE: gpConEmu->CheckGlassAttribute(); return false; case 0xAE: /*WM_NCUAHDRAWCAPTION*/ lResult = OnDwmMessage(hWnd, uMsg, wParam, lParam); return true; case 0xAF: /*WM_NCUAHDRAWFRAME*/ lResult = OnDwmMessage(hWnd, uMsg, wParam, lParam); return true; case 0x31E: /*WM_DWMCOMPOSITIONCHANGED*/ lResult = OnDwmMessage(hWnd, uMsg, wParam, lParam); return true; case WM_WINDOWPOSCHANGED: lResult = OnWindowPosChanged(hWnd, uMsg, wParam, lParam); return true; case WM_SYSCOMMAND: if (wParam == SC_MAXIMIZE || wParam == SC_MINIMIZE || wParam == SC_RESTORE) { mb_NcAnimate = TRUE; //GetWindowText(hWnd, ms_LastCaption, countof(ms_LastCaption)); //SetWindowText(hWnd, L""); } lResult = gpConEmu->OnSysCommand(hWnd, wParam, lParam); if (wParam == SC_MAXIMIZE || wParam == SC_MINIMIZE || wParam == SC_RESTORE) { mb_NcAnimate = FALSE; //SetWindowText(hWnd, ms_LastCaption); } return true; case WM_GETTEXT: //TODO: Во время анимации Maximize/Restore/Minimize заголовок отрисовывается //TODO: системой, в итоге мелькает текст и срезаются табы //TODO: Сделаем, пока, чтобы текст хотя бы не мелькал... if (mb_NcAnimate && gpSet->isTabsInCaption) { if (wParam && lParam) { *(wchar_t*)lParam = 0; } lResult = 0; return true; } break; default: break; } return false; }