static LRESULT IPADDRESS_Draw (const IPADDRESS_INFO *infoPtr, HDC hdc) { static const WCHAR dotW[] = { '.', 0 }; RECT rect, rcPart; COLORREF bgCol, fgCol; HTHEME theme; int i, state = ETS_NORMAL; TRACE("\n"); GetClientRect (infoPtr->Self, &rect); theme = OpenThemeData(infoPtr->Self, WC_EDITW); if (theme) { DWORD dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE); if (!infoPtr->Enabled) state = ETS_DISABLED; else if (dwStyle & ES_READONLY) state = ETS_READONLY; else if (GetFocus() == infoPtr->Self) state = ETS_FOCUSED; GetThemeColor(theme, EP_EDITTEXT, state, TMT_FILLCOLOR, &bgCol); GetThemeColor(theme, EP_EDITTEXT, state, TMT_TEXTCOLOR, &fgCol); if (IsThemeBackgroundPartiallyTransparent (theme, EP_EDITTEXT, state)) DrawThemeParentBackground(infoPtr->Self, hdc, &rect); DrawThemeBackground (theme, hdc, EP_EDITTEXT, state, &rect, 0); } else { if (infoPtr->Enabled) { bgCol = comctl32_color.clrWindow; fgCol = comctl32_color.clrWindowText; } else { bgCol = comctl32_color.clr3dFace; fgCol = comctl32_color.clrGrayText; } FillRect (hdc, &rect, (HBRUSH)(DWORD_PTR)(bgCol+1)); DrawEdge (hdc, &rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST); } SetBkColor (hdc, bgCol); SetTextColor(hdc, fgCol); for (i = 0; i < 3; i++) { GetWindowRect (infoPtr->Part[i].EditHwnd, &rcPart); MapWindowPoints( 0, infoPtr->Self, (POINT *)&rcPart, 2 ); rect.left = rcPart.right; GetWindowRect (infoPtr->Part[i+1].EditHwnd, &rcPart); MapWindowPoints( 0, infoPtr->Self, (POINT *)&rcPart, 2 ); rect.right = rcPart.left; if (theme) DrawThemeText(theme, hdc, EP_EDITTEXT, state, dotW, 1, DT_SINGLELINE | DT_CENTER | DT_BOTTOM, 0, &rect); else DrawTextW(hdc, dotW, 1, &rect, DT_SINGLELINE | DT_CENTER | DT_BOTTOM); } if (theme) CloseThemeData(theme); return 0; }
static LRESULT PAGER_MouseMove (PAGER_INFO* infoPtr, INT keys, INT x, INT y) { POINT clpt, pt; RECT wnrect, *btnrect = NULL; BOOL topLeft = FALSE; INT btnstate = 0; INT hit; HDC hdc; pt.x = x; pt.y = y; TRACE("[%p] to (%d,%d)\n", infoPtr->hwndSelf, x, y); ClientToScreen(infoPtr->hwndSelf, &pt); GetWindowRect(infoPtr->hwndSelf, &wnrect); if (PtInRect(&wnrect, pt)) { RECT TLbtnrect, BRbtnrect; PAGER_GetButtonRects(infoPtr, &TLbtnrect, &BRbtnrect, FALSE); clpt = pt; MapWindowPoints(0, infoPtr->hwndSelf, &clpt, 1); hit = PAGER_HitTest(infoPtr, &clpt); if ((hit == PGB_TOPORLEFT) && (infoPtr->TLbtnState == PGF_NORMAL)) { topLeft = TRUE; btnrect = &TLbtnrect; infoPtr->TLbtnState = PGF_HOT; btnstate = infoPtr->TLbtnState; } else if ((hit == PGB_BOTTOMORRIGHT) && (infoPtr->BRbtnState == PGF_NORMAL)) { topLeft = FALSE; btnrect = &BRbtnrect; infoPtr->BRbtnState = PGF_HOT; btnstate = infoPtr->BRbtnState; } /* If in one of the buttons the capture and draw buttons */ if (btnrect) { TRACE("[%p] draw btn (%s), Capture %s, style %08x\n", infoPtr->hwndSelf, wine_dbgstr_rect(btnrect), (infoPtr->bCapture) ? "TRUE" : "FALSE", infoPtr->dwStyle); if (!infoPtr->bCapture) { TRACE("[%p] SetCapture\n", infoPtr->hwndSelf); SetCapture(infoPtr->hwndSelf); infoPtr->bCapture = TRUE; } if (infoPtr->dwStyle & PGS_AUTOSCROLL) SetTimer(infoPtr->hwndSelf, TIMERID1, 0x3e, 0); hdc = GetWindowDC(infoPtr->hwndSelf); /* OffsetRect(wnrect, 0 | 1, 0 | 1) */ PAGER_DrawButton(hdc, infoPtr->clrBk, *btnrect, infoPtr->dwStyle & PGS_HORZ, topLeft, btnstate); ReleaseDC(infoPtr->hwndSelf, hdc); return 0; } } /* If we think we are captured, then do release */ if (infoPtr->bCapture && (WindowFromPoint(pt) != infoPtr->hwndSelf)) { NMHDR nmhdr; infoPtr->bCapture = FALSE; if (GetCapture() == infoPtr->hwndSelf) { ReleaseCapture(); if (infoPtr->TLbtnState == PGF_GRAYED) { infoPtr->TLbtnState = PGF_INVISIBLE; SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); } else if (infoPtr->TLbtnState == PGF_HOT) { infoPtr->TLbtnState = PGF_NORMAL; /* FIXME: just invalidate button rect */ RedrawWindow(infoPtr->hwndSelf, NULL, NULL, RDW_FRAME | RDW_INVALIDATE); } if (infoPtr->BRbtnState == PGF_GRAYED) { infoPtr->BRbtnState = PGF_INVISIBLE; SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); } else if (infoPtr->BRbtnState == PGF_HOT) { infoPtr->BRbtnState = PGF_NORMAL; /* FIXME: just invalidate button rect */ RedrawWindow(infoPtr->hwndSelf, NULL, NULL, RDW_FRAME | RDW_INVALIDATE); } /* Notify parent of released mouse capture */ memset(&nmhdr, 0, sizeof(NMHDR)); nmhdr.hwndFrom = infoPtr->hwndSelf; nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); nmhdr.code = NM_RELEASEDCAPTURE; SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); } if (IsWindow(infoPtr->hwndSelf)) KillTimer(infoPtr->hwndSelf, TIMERID1); } return 0; }
//First tracking method: attaches to Tray process and reads data directly, is fast and reliable but will fail if user uses non standard tray software //It was suggested by Neal Andrews with VB example: http://www.codeproject.com/shell/ctrayiconposition.asp?select=999036&forumid=14631&df=100#xx999036xx //Ported to C++ by Ireneusz Zielinski BOOL CTrayIconPosition::FindOutPositionOfIconDirectly(const HWND a_hWndOwner, const int a_iButtonID, CRect& a_rcIcon) { //first of all let's find a Tool bar control embed in Tray window HWND hWndTray = GetTrayNotifyWnd(TRUE); if (hWndTray == NULL) { return FALSE; } //now we have to get an ID of the parent process for system tray DWORD dwTrayProcessID = -1; GetWindowThreadProcessId(hWndTray, &dwTrayProcessID); if(dwTrayProcessID <= 0) { return FALSE; } HANDLE hTrayProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwTrayProcessID); if(hTrayProc == NULL) { return FALSE; } //now we check how many buttons is there - should be more than 0 int iButtonsCount = SendMessage(hWndTray, TB_BUTTONCOUNT, 0, 0); //We want to get data from another process - it's not possible to just send messages like TB_GETBUTTON with a localy //allocated buffer for return data. Pointer to localy allocated data has no usefull meaning in a context of another //process (since Win95) - so we need to allocate some memory inside Tray process. //We allocate sizeof(TBBUTTON) bytes of memory - because TBBUTTON is the biggest structure we will fetch. But this buffer //will be also used to get smaller pieces of data like RECT structures. LPVOID lpData = VirtualAllocEx(hTrayProc, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE); if( lpData == NULL || iButtonsCount < 1 ) { CloseHandle(hTrayProc); return FALSE; } BOOL bIconFound = FALSE; for(int iButton=0; iButton<iButtonsCount; iButton++) { //first let's read TBUTTON information about each button in a task bar of tray DWORD dwBytesRead = -1; TBBUTTON buttonData; SendMessage(hWndTray, TB_GETBUTTON, iButton, (LPARAM)lpData); ReadProcessMemory(hTrayProc, lpData, &buttonData, sizeof(TBBUTTON), &dwBytesRead); if(dwBytesRead < sizeof(TBBUTTON)) { continue; } //now let's read extra data associated with each button: there will be a HWND of the window that created an icon and icon ID DWORD dwExtraData[2] = { 0,0 }; ReadProcessMemory(hTrayProc, (LPVOID)buttonData.dwData, dwExtraData, sizeof(dwExtraData), &dwBytesRead); if(dwBytesRead < sizeof(dwExtraData)) { continue; } HWND hWndOfIconOwner = (HWND) dwExtraData[0]; int iIconId = (int) dwExtraData[1]; if(hWndOfIconOwner != a_hWndOwner || iIconId != a_iButtonID) { continue; } //we found our icon - in WinXP it could be hidden - let's check it: if( buttonData.fsState & TBSTATE_HIDDEN ) { break; } //now just ask a tool bar of rectangle of our icon RECT rcPosition = {0,0}; SendMessage(hWndTray, TB_GETITEMRECT, iButton, (LPARAM)lpData); ReadProcessMemory(hTrayProc, lpData, &rcPosition, sizeof(RECT), &dwBytesRead); if(dwBytesRead < sizeof(RECT)) { continue; } MapWindowPoints(hWndTray, NULL, (LPPOINT)&rcPosition, 2); a_rcIcon = rcPosition; bIconFound = TRUE; break; } if(bIconFound == FALSE) { a_rcIcon = GetTrayWndRect(); //we failed to detect position of icon - let's return fail safe cooridinates of system tray } VirtualFreeEx(hTrayProc, lpData, NULL, MEM_RELEASE); CloseHandle(hTrayProc); return bIconFound; }
void SetGeneralInfo(HWND hwnd) { TCHAR ach[256]; HWND hwndDlg = WinSpyTab[GENERAL_TAB].hwnd; RECT rect; int x1, y1; int i, numbytes, index; LONG_PTR lp; DWORD dwLastError; if(hwnd == 0) return; //handle wsprintf(ach, szHexFmt, hwnd); SetDlgItemText(hwndDlg, IDC_HANDLE, ach); //caption ShowDlgItem(hwndDlg, IDC_CAPTION1, SW_SHOW); ShowDlgItem(hwndDlg, IDC_CAPTION2, SW_HIDE); SendDlgItemMessage(hwndDlg, IDC_CAPTION2, CB_RESETCONTENT, 0, 0); if(!IsWindow(hwnd)) { SetDlgItemText(hwndDlg, IDC_CAPTION1, L"(invalid window)"); // edit box SetDlgItemText(hwndDlg, IDC_CAPTION2, L"(invalid window)"); // combo box SetDlgItemText(hwndDlg, IDC_CLASS, L"(invalid window)"); return; } // SendMessage is better than GetWindowText, // because it gets text of children in other processes if(spy_fPassword == FALSE) { ach[0] = 0; if(!SendMessageTimeout(hwnd, WM_GETTEXT, sizeof(ach) / sizeof(TCHAR), (LPARAM)ach, SMTO_ABORTIFHUNG, 100, NULL)) { GetWindowText(hwnd, ach, sizeof(ach) / sizeof(TCHAR)); } SetDlgItemText(hwndDlg, IDC_CAPTION1, ach); // edit box SetDlgItemText(hwndDlg, IDC_CAPTION2, ach); // combo box } else { SetDlgItemText(hwndDlg, IDC_CAPTION1, spy_szPassword); // edit box SetDlgItemText(hwndDlg, IDC_CAPTION2, spy_szPassword); // combo box } //class name GetClassName(hwnd, ach, sizeof(ach)/sizeof(TCHAR)); if(IsWindowUnicode(hwnd)) lstrcat(ach, _T(" (Unicode)")); SetDlgItemText(hwndDlg, IDC_CLASS, ach); //style wsprintf(ach, szHexFmt, GetWindowLong(hwnd, GWL_STYLE)); if(IsWindowVisible(hwnd)) lstrcat(ach, _T(" (visible, ")); else lstrcat(ach, _T(" (hidden, ")); if(IsWindowEnabled(hwnd)) lstrcat(ach, _T("enabled)")); else lstrcat(ach, _T("disabled)")); SetDlgItemText(hwndDlg, IDC_STYLE, ach); //rectangle GetWindowRect(hwnd, &rect); x1 = rect.left; y1 = rect.top; wsprintf(ach, _T("(%d,%d) - (%d,%d) - %dx%d"), rect.left,rect.top, rect.right,rect.bottom, (rect.right-rect.left), (rect.bottom-rect.top)); SetDlgItemText(hwndDlg, IDC_RECTANGLE, ach); //client rect GetClientRect(hwnd, &rect); MapWindowPoints(hwnd, 0, (POINT *)&rect, 2); x1 = rect.left-x1; y1 = rect.top-y1; OffsetRect(&rect, -rect.left, -rect.top); OffsetRect(&rect, x1, y1); wsprintf(ach, _T("(%d,%d) - (%d,%d) - %dx%d"), rect.left,rect.top, rect.right,rect.bottom, (rect.right-rect.left), (rect.bottom-rect.top)); SetDlgItemText(hwndDlg, IDC_CLIENTRECT, ach); //restored rect /*GetWindowPlacement(hwnd, &wp); wsprintf(ach, _T("(%d,%d) - (%d,%d) - %dx%d"), wp.rcNormalPosition.left, wp.rcNormalPosition.top, wp.rcNormalPosition.right, wp.rcNormalPosition.bottom, (wp.rcNormalPosition.right-wp.rcNormalPosition.left), (wp.rcNormalPosition.bottom-wp.rcNormalPosition.top)); SetDlgItemText(hwndDlg, IDC_RESTOREDRECT, ach);*/ //window procedure if(spy_WndProc == 0) { wsprintf(ach, _T("N/A")); SetDlgItemText(hwndDlg, IDC_WINDOWPROC, ach); ShowDlgItem(hwndDlg, IDC_WINDOWPROC, SW_SHOW); ShowDlgItem(hwndDlg, IDC_WINDOWPROC2, SW_HIDE); } else { wsprintf(ach, szPtrFmt, spy_WndProc); SetDlgItemText(hwndDlg, IDC_WINDOWPROC2, ach); ShowDlgItem(hwndDlg, IDC_WINDOWPROC, SW_HIDE); ShowDlgItem(hwndDlg, IDC_WINDOWPROC2, SW_SHOW); } //instance handle wsprintf(ach, szPtrFmt, GetWindowLongPtr(hwnd, GWLP_HINSTANCE)); SetDlgItemText(hwndDlg, IDC_INSTANCE, ach); //user data wsprintf(ach, szPtrFmt, GetWindowLongPtr(hwnd, GWLP_USERDATA)); SetDlgItemText(hwndDlg, IDC_USERDATA, ach); //control ID lp = GetWindowLongPtr(hwnd, GWLP_ID); wsprintf(ach, _T("%p (%Id)"), lp, lp); SetDlgItemText(hwndDlg, IDC_CONTROLID, ach); //extra window bytes numbytes = GetClassLong(hwnd, GCL_CBWNDEXTRA); i = 0; SendDlgItemMessage(hwndDlg, IDC_WINDOWBYTES, CB_RESETCONTENT, 0, 0); EnableDlgItem(hwndDlg, IDC_WINDOWBYTES, numbytes != 0); // Retrieve all the window bytes + add to combo box while(numbytes > 0) { SetLastError(ERROR_SUCCESS); if(numbytes <= sizeof(long)) lp = GetWindowLong(hwnd, i); else lp = GetWindowLongPtr(hwnd, i); dwLastError = GetLastError(); if(dwLastError == ERROR_PRIVATE_DIALOG_INDEX) break; if(dwLastError == ERROR_SUCCESS) { if(numbytes < sizeof(LONG_PTR)) { switch(numbytes) { case 4: wsprintf(ach, _T("+%-8d %08X"), i, lp); break; case 2: wsprintf(ach, _T("+%-8d %04X"), i, lp); break; default: wsprintf(ach, _T("+%-8d %X"), i, lp); break; } } else wsprintf(ach, _T("+%-8d %08p"), i, lp); } else wsprintf(ach, _T("+%-8d Unavailable (0x%08X)"), i, dwLastError); i += sizeof(LONG_PTR); numbytes -= sizeof(LONG_PTR); index = (int)SendDlgItemMessage(hwndDlg, IDC_WINDOWBYTES, CB_ADDSTRING, 0, (LPARAM)ach); if(dwLastError == ERROR_SUCCESS) SendDlgItemMessage(hwndDlg, IDC_WINDOWBYTES, CB_SETITEMDATA, index, lp); else SendDlgItemMessage(hwndDlg, IDC_WINDOWBYTES, CB_SETITEMDATA, index, dwLastError); } SendDlgItemMessage(hwndDlg, IDC_WINDOWBYTES, CB_SETCURSEL, 0, 0); }
static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT *src_rect_in, const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags) { const struct wined3d_fb_state *fb = &swapchain->device->fb; const struct wined3d_gl_info *gl_info; struct wined3d_context *context; RECT src_rect, dst_rect; BOOL render_to_fbo; context = context_acquire(swapchain->device, swapchain->back_buffers[0]); if (!context->valid) { context_release(context); WARN("Invalid context, skipping present.\n"); return WINED3D_OK; } gl_info = context->gl_info; /* Render the cursor onto the back buffer, using our nifty directdraw blitting code :-) */ if (swapchain->device->bCursorVisible && swapchain->device->cursorTexture && !swapchain->device->hardwareCursor) { struct wined3d_surface cursor; RECT destRect = { swapchain->device->xScreenSpace - swapchain->device->xHotSpot, swapchain->device->yScreenSpace - swapchain->device->yHotSpot, swapchain->device->xScreenSpace + swapchain->device->cursorWidth - swapchain->device->xHotSpot, swapchain->device->yScreenSpace + swapchain->device->cursorHeight - swapchain->device->yHotSpot, }; TRACE("Rendering the cursor. Creating fake surface at %p\n", &cursor); /* Build a fake surface to call the Blitting code. It is not possible to use the interface passed by * the application because we are only supposed to copy the information out. Using a fake surface * allows to use the Blitting engine and avoid copying the whole texture -> render target blitting code. */ memset(&cursor, 0, sizeof(cursor)); cursor.resource.ref = 1; cursor.resource.device = swapchain->device; cursor.resource.pool = WINED3DPOOL_SCRATCH; cursor.resource.format = wined3d_get_format(gl_info, WINED3DFMT_B8G8R8A8_UNORM); cursor.resource.resourceType = WINED3DRTYPE_SURFACE; cursor.texture_name = swapchain->device->cursorTexture; cursor.texture_target = GL_TEXTURE_2D; cursor.texture_level = 0; cursor.resource.width = swapchain->device->cursorWidth; cursor.resource.height = swapchain->device->cursorHeight; /* The cursor must have pow2 sizes */ cursor.pow2Width = cursor.resource.width; cursor.pow2Height = cursor.resource.height; /* The surface is in the texture */ cursor.flags |= SFLAG_INTEXTURE; /* DDBLT_KEYSRC will cause BltOverride to enable the alpha test with GL_NOTEQUAL, 0.0, * which is exactly what we want :-) */ if (swapchain->presentParms.Windowed) MapWindowPoints(NULL, swapchain->win_handle, (LPPOINT)&destRect, 2); wined3d_surface_blt(swapchain->back_buffers[0], &destRect, &cursor, NULL, WINEDDBLT_KEYSRC, NULL, WINED3DTEXF_POINT); } if (swapchain->device->logo_surface) { /* Blit the logo into the upper left corner of the drawable. */ wined3d_surface_bltfast(swapchain->back_buffers[0], 0, 0, swapchain->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY); } TRACE("Presenting HDC %p.\n", context->hdc); render_to_fbo = swapchain->render_to_fbo; if (src_rect_in) { src_rect = *src_rect_in; if (!render_to_fbo && (src_rect.left || src_rect.top || src_rect.right != swapchain->presentParms.BackBufferWidth || src_rect.bottom != swapchain->presentParms.BackBufferHeight)) { render_to_fbo = TRUE; } } else { src_rect.left = 0; src_rect.top = 0; src_rect.right = swapchain->presentParms.BackBufferWidth; src_rect.bottom = swapchain->presentParms.BackBufferHeight; } if (dst_rect_in) dst_rect = *dst_rect_in; else GetClientRect(swapchain->win_handle, &dst_rect); if (!render_to_fbo && (dst_rect.left || dst_rect.top || dst_rect.right != swapchain->presentParms.BackBufferWidth || dst_rect.bottom != swapchain->presentParms.BackBufferHeight)) { render_to_fbo = TRUE; } /* Rendering to a window of different size, presenting partial rectangles, * or rendering to a different window needs help from FBO_blit or a textured * draw. Render the swapchain to a FBO in the future. * * Note that FBO_blit from the backbuffer to the frontbuffer cannot solve * all these issues - this fails if the window is smaller than the backbuffer. */ if (!swapchain->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO) { surface_load_location(swapchain->back_buffers[0], SFLAG_INTEXTURE, NULL); surface_modify_location(swapchain->back_buffers[0], SFLAG_INDRAWABLE, FALSE); swapchain->render_to_fbo = TRUE; } if (swapchain->render_to_fbo) { /* This codepath should only be hit with the COPY swapeffect. Otherwise a backbuffer- * window size mismatch is impossible(fullscreen) and src and dst rectangles are * not allowed(they need the COPY swapeffect) * * The DISCARD swap effect is ok as well since any backbuffer content is allowed after * the swap. */ if (swapchain->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP) FIXME("Render-to-fbo with WINED3DSWAPEFFECT_FLIP\n"); swapchain_blit(swapchain, context, &src_rect, &dst_rect); } if (swapchain->num_contexts > 1) wglFinish(); SwapBuffers(context->hdc); /* TODO: cycle through the swapchain buffers */ TRACE("SwapBuffers called, Starting new frame\n"); /* FPS support */ if (TRACE_ON(fps)) { DWORD time = GetTickCount(); ++swapchain->frames; /* every 1.5 seconds */ if (time - swapchain->prev_time > 1500) { TRACE_(fps)("%p @ approx %.2ffps\n", swapchain, 1000.0 * swapchain->frames / (time - swapchain->prev_time)); swapchain->prev_time = time; swapchain->frames = 0; } } /* This is disabled, but the code left in for debug purposes. * * Since we're allowed to modify the new back buffer on a D3DSWAPEFFECT_DISCARD flip, * we can clear it with some ugly color to make bad drawing visible and ease debugging. * The Debug runtime does the same on Windows. However, a few games do not redraw the * screen properly, like Max Payne 2, which leaves a few pixels undefined. * * Tests show that the content of the back buffer after a discard flip is indeed not * reliable, so no game can depend on the exact content. However, it resembles the * old contents in some way, for example by showing fragments at other locations. In * general, the color theme is still intact. So Max payne, which draws rather dark scenes * gets a dark background image. If we clear it with a bright ugly color, the game's * bug shows up much more than it does on Windows, and the players see single pixels * with wrong colors. * (The Max Payne bug has been confirmed on Windows with the debug runtime) */ if (FALSE && swapchain->presentParms.SwapEffect == WINED3DSWAPEFFECT_DISCARD) { TRACE("Clearing the color buffer with cyan color\n"); wined3d_device_clear(swapchain->device, 0, NULL, WINED3DCLEAR_TARGET, 0xff00ffff, 1.0f, 0); } if (!swapchain->render_to_fbo && ((swapchain->front_buffer->flags & SFLAG_INSYSMEM) || (swapchain->back_buffers[0]->flags & SFLAG_INSYSMEM))) { /* Both memory copies of the surfaces are ok, flip them around too instead of dirtifying * Doesn't work with render_to_fbo because we're not flipping */ struct wined3d_surface *front = swapchain->front_buffer; struct wined3d_surface *back = swapchain->back_buffers[0]; if(front->resource.size == back->resource.size) { DWORD fbflags; flip_surface(front, back); /* Tell the front buffer surface that is has been modified. However, * the other locations were preserved during that, so keep the flags. * This serves to update the emulated overlay, if any. */ fbflags = front->flags; surface_modify_location(front, SFLAG_INDRAWABLE, TRUE); front->flags = fbflags; } else { surface_modify_location(front, SFLAG_INDRAWABLE, TRUE); surface_modify_location(back, SFLAG_INDRAWABLE, TRUE); } } else { surface_modify_location(swapchain->front_buffer, SFLAG_INDRAWABLE, TRUE); /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM * and INTEXTURE copies can keep their old content if they have any defined content. * If the swapeffect is COPY, the content remains the same. If it is FLIP however, * the texture / sysmem copy needs to be reloaded from the drawable */ if (swapchain->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP) surface_modify_location(swapchain->back_buffers[0], SFLAG_INDRAWABLE, TRUE); } if (fb->depth_stencil) { if (swapchain->presentParms.Flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL || fb->depth_stencil->flags & SFLAG_DISCARD) { surface_modify_ds_location(fb->depth_stencil, SFLAG_DS_DISCARDED, fb->depth_stencil->resource.width, fb->depth_stencil->resource.height); if (fb->depth_stencil == swapchain->device->onscreen_depth_stencil) { wined3d_surface_decref(swapchain->device->onscreen_depth_stencil); swapchain->device->onscreen_depth_stencil = NULL; } } } context_release(context); TRACE("returning\n"); return WINED3D_OK; }
static INT_PTR CALLBACK CheckOptionsFastProc(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { switch (messg) { case WM_SETHOTKEY: gnWndSetHotkey = wParam; break; case WM_INITDIALOG: { SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hClassIcon); SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hClassIconSm); LRESULT lbRc = FALSE; if (lParam) { SetWindowText(hDlg, (LPCWSTR)lParam); } else { wchar_t szTitle[512]; wcscpy_c(szTitle, gpConEmu->GetDefaultTitle()); wcscat_c(szTitle, L" fast configuration"); SetWindowText(hDlg, szTitle); } // lbStorageLocation SettingsStorage Storage = {}; bool ReadOnly = false; gpSet->GetSettingsType(Storage, ReadOnly); wchar_t* pszSettingsPlaces[] = { lstrdup(L"HKEY_CURRENT_USER\\Software\\ConEmu"), ExpandEnvStr(L"%APPDATA%\\ConEmu.xml"), ExpandEnvStr(L"%ConEmuBaseDir%\\ConEmu.xml"), ExpandEnvStr(L"%ConEmuDir%\\ConEmu.xml"), NULL }; int iAllowed = 0; if (lstrcmp(Storage.szType, CONEMU_CONFIGTYPE_XML) == 0) { iAllowed = 1; // Реестр уже низя if (Storage.pszFile) { if (lstrcmpi(Storage.pszFile, pszSettingsPlaces[1]) == 0) iAllowed = 1; // OK, перебить может любой другой xml else if (lstrcmpi(Storage.pszFile, pszSettingsPlaces[2]) == 0) iAllowed = 2; // "Перебить" может только %APPDATA% else if (lstrcmpi(Storage.pszFile, pszSettingsPlaces[3]) == 0) iAllowed = 3; // Приоритетнее настроек нет else { // Этот xml мог быть указан в "/LoadCfgFile ..." SafeFree(pszSettingsPlaces[3]); pszSettingsPlaces[3] = lstrdup(Storage.pszFile); iAllowed = 3; // Приоритетнее настроек нет } } } while (pszSettingsPlaces[iAllowed]) { SendDlgItemMessage(hDlg, lbStorageLocation, CB_ADDSTRING, 0, (LPARAM)pszSettingsPlaces[iAllowed]); iAllowed++; } SendDlgItemMessage(hDlg, lbStorageLocation, CB_SETCURSEL, 0, 0); for (int i = 0; pszSettingsPlaces[i]; i++) { SafeFree(pszSettingsPlaces[i]); } // continue CheckDlgButton(hDlg, cbSingleInstance, gpSetCls->IsSingleInstanceArg()); CheckDlgButton(hDlg, cbUseKeyboardHooksFast, gpSet->isKeyboardHooks(true)); // Debug purposes only. ConEmu.exe switch "/nokeyhooks" #ifdef _DEBUG EnableWindow(GetDlgItem(hDlg, cbUseKeyboardHooksFast), !gpConEmu->DisableKeybHooks); #endif CheckDlgButton(hDlg, cbInjectConEmuHkFast, gpSet->isUseInjects); if (!gpConEmu->isUpdateAllowed()) { EnableWindow(GetDlgItem(hDlg, cbEnableAutoUpdateFast), FALSE); EnableWindow(GetDlgItem(hDlg, rbAutoUpdateStableFast), FALSE); EnableWindow(GetDlgItem(hDlg, rbAutoUpdatePreviewFast), FALSE); EnableWindow(GetDlgItem(hDlg, rbAutoUpdateDeveloperFast), FALSE); EnableWindow(GetDlgItem(hDlg, stEnableAutoUpdateFast), FALSE); } else { if (gpSet->UpdSet.isUpdateUseBuilds != 0) CheckDlgButton(hDlg, cbEnableAutoUpdateFast, gpSet->UpdSet.isUpdateCheckOnStartup|gpSet->UpdSet.isUpdateCheckHourly); CheckRadioButton(hDlg, rbAutoUpdateStableFast, rbAutoUpdateDeveloperFast, (gpSet->UpdSet.isUpdateUseBuilds == 1) ? rbAutoUpdateStableFast : (gpSet->UpdSet.isUpdateUseBuilds == 3) ? rbAutoUpdatePreviewFast : rbAutoUpdateDeveloperFast); } if (!bCheckIme) { ShowWindow(GetDlgItem(hDlg, gbDisableConImeFast), SW_HIDE); ShowWindow(GetDlgItem(hDlg, cbDisableConImeFast), SW_HIDE); ShowWindow(GetDlgItem(hDlg, stDisableConImeFast1), SW_HIDE); ShowWindow(GetDlgItem(hDlg, stDisableConImeFast2), SW_HIDE); ShowWindow(GetDlgItem(hDlg, stDisableConImeFast3), SW_HIDE); RECT rcGroup, rcBtn, rcWnd; if (GetWindowRect(GetDlgItem(hDlg, gbDisableConImeFast), &rcGroup)) { int nShift = (rcGroup.bottom-rcGroup.top); HWND h = GetDlgItem(hDlg, IDOK); GetWindowRect(h, &rcBtn); MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtn, 2); SetWindowPos(h, NULL, rcBtn.left, rcBtn.top - nShift, 0,0, SWP_NOSIZE|SWP_NOZORDER); h = GetDlgItem(hDlg, IDCANCEL); GetWindowRect(h, &rcBtn); MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtn, 2); SetWindowPos(h, NULL, rcBtn.left, rcBtn.top - nShift, 0,0, SWP_NOSIZE|SWP_NOZORDER); h = GetDlgItem(hDlg, stHomePage); GetWindowRect(h, &rcBtn); MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtn, 2); SetWindowPos(h, NULL, rcBtn.left, rcBtn.top - nShift, 0,0, SWP_NOSIZE|SWP_NOZORDER); GetWindowRect(hDlg, &rcWnd); MoveWindow(hDlg, rcWnd.left, rcWnd.top+(nShift>>1), rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top-nShift, FALSE); } } return lbRc; }
INT_PTR CRecreateDlg::OnInitDialog(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { LRESULT lbRc = FALSE; gpConEmu->OnOurDialogOpened(); // Visual SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hClassIcon); SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hClassIconSm); // Set password style (avoid "bars" on some OS) SendDlgItemMessage(hDlg, tRunAsPassword, WM_SETFONT, (LPARAM)(HFONT)GetStockObject(DEFAULT_GUI_FONT), 0); // Add menu items HMENU hSysMenu = GetSystemMenu(hDlg, FALSE); InsertMenu(hSysMenu, 0, MF_BYPOSITION, MF_SEPARATOR, 0); InsertMenu(hSysMenu, 0, MF_BYPOSITION | MF_STRING | MF_ENABLED, ID_RESETCMDHISTORY, L"Clear history..."); InsertMenu(hSysMenu, 0, MF_BYPOSITION | MF_STRING | MF_ENABLED | (gpSet->isSaveCmdHistory ? MF_CHECKED : 0), ID_STORECMDHISTORY, L"Store history"); //#ifdef _DEBUG //SetWindowPos(ghOpWnd, HWND_NOTOPMOST, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE); //#endif RConStartArgs* pArgs = mp_Args; _ASSERTE(pArgs); // Fill command and task drop down SendMessage(hDlg, UM_FILL_CMDLIST, TRUE, 0); // Set text in command and folder fields SetDlgItemText(hDlg, IDC_RESTART_CMD, mpsz_DefCmd ? mpsz_DefCmd : pArgs->pszSpecialCmd ? pArgs->pszSpecialCmd : L""); // Current directory, startup directory, ConEmu startup directory, and may be startup directory history in the future AddDirectoryList(mpsz_DefDir ? mpsz_DefDir : pArgs->pszStartupDir); AddDirectoryList(ms_RConCurDir); AddDirectoryList(ms_RConStartDir); AddDirectoryList(gpConEmu->WorkDir()); LPCWSTR pszShowDir; if ((pArgs->aRecreate == cra_RecreateTab) && !ms_RConCurDir.IsEmpty()) pszShowDir = ms_RConCurDir; else pszShowDir = mpsz_DefDir ? mpsz_DefDir : pArgs->pszStartupDir ? pArgs->pszStartupDir : gpConEmu->WorkDir(); SetDlgItemText(hDlg, IDC_STARTUP_DIR, pszShowDir); // Split controls if (pArgs->aRecreate == cra_RecreateTab) { // Hide Split's ShowWindow(GetDlgItem(hDlg, gbRecreateSplit), SW_HIDE); ShowWindow(GetDlgItem(hDlg, rbRecreateSplitNone), SW_HIDE); ShowWindow(GetDlgItem(hDlg, rbRecreateSplit2Right), SW_HIDE); ShowWindow(GetDlgItem(hDlg, rbRecreateSplit2Bottom), SW_HIDE); ShowWindow(GetDlgItem(hDlg, stRecreateSplit), SW_HIDE); ShowWindow(GetDlgItem(hDlg, tRecreateSplit), SW_HIDE); } else { // Fill splits SetDlgItemInt(hDlg, tRecreateSplit, (1000-pArgs->nSplitValue)/10, FALSE); CheckRadioButton(hDlg, rbRecreateSplitNone, rbRecreateSplit2Bottom, rbRecreateSplitNone+pArgs->eSplit); EnableWindow(GetDlgItem(hDlg, tRecreateSplit), (pArgs->eSplit != pArgs->eSplitNone)); EnableWindow(GetDlgItem(hDlg, stRecreateSplit), (pArgs->eSplit != pArgs->eSplitNone)); } // Спрятать флажок "New window" bool bRunInNewWindow_Hidden = (pArgs->aRecreate == cra_EditTab || pArgs->aRecreate == cra_RecreateTab); ShowWindow(GetDlgItem(hDlg, cbRunInNewWindow), bRunInNewWindow_Hidden ? SW_HIDE : SW_SHOWNORMAL); const wchar_t *pszUser = pArgs->pszUserName; const wchar_t *pszDomain = pArgs->pszDomain; bool bResticted = (pArgs->RunAsRestricted == crb_On); int nChecked = rbCurrentUser; DWORD nUserNameLen = countof(ms_CurUser); if (!GetUserName(ms_CurUser, &nUserNameLen)) ms_CurUser[0] = 0; wchar_t szRbCaption[MAX_PATH*3]; lstrcpy(szRbCaption, L"Run as current &user: "******"UPN format" остается в pszUser lstrcpyn(szOtherUser, pszUser, MAX_PATH); wcscat_c(szOtherUser, L"@"); lstrcpyn(szOtherUser+_tcslen(szOtherUser), pszDomain, MAX_PATH); } else { // "Старая" нотация domain\user lstrcpyn(szOtherUser, pszDomain, MAX_PATH); wcscat_c(szOtherUser, L"\\"); lstrcpyn(szOtherUser+_tcslen(szOtherUser), pszUser, MAX_PATH); } } else { lstrcpyn(szOtherUser, pszUser, countof(szOtherUser)); } SetDlgItemText(hDlg, tRunAsPassword, pArgs->szUserPassword); } } SetDlgItemText(hDlg, tRunAsUser, (nChecked == rbAnotherUser) ? szOtherUser : L""); CheckRadioButton(hDlg, rbCurrentUser, rbAnotherUser, nChecked); RecreateDlgProc(hDlg, UM_USER_CONTROLS, 0, 0); if (gOSVer.dwMajorVersion < 6) { // В XP и ниже это просто RunAs - с возможностью ввода имени пользователя и пароля //apiShowWindow(GetDlgItem(hDlg, cbRunAsAdmin), SW_HIDE); SetDlgItemTextA(hDlg, cbRunAsAdmin, "&Run as..."); //GCC hack. иначе не собирается // И уменьшить длину RECT rcBox; GetWindowRect(GetDlgItem(hDlg, cbRunAsAdmin), &rcBox); SetWindowPos(GetDlgItem(hDlg, cbRunAsAdmin), NULL, 0, 0, (rcBox.right-rcBox.left)/2, rcBox.bottom-rcBox.top, SWP_NOMOVE|SWP_NOZORDER); } else if (gpConEmu->mb_IsUacAdmin || (pArgs && (pArgs->RunAsAdministrator == crb_On))) { CheckDlgButton(hDlg, cbRunAsAdmin, BST_CHECKED); if (gpConEmu->mb_IsUacAdmin) // Только в Vista+ если GUI уже запущен под админом { EnableWindow(GetDlgItem(hDlg, cbRunAsAdmin), FALSE); } else //if (gOSVer.dwMajorVersion < 6) { RecreateDlgProc(hDlg, WM_COMMAND, cbRunAsAdmin, 0); } } //} SetClassLongPtr(hDlg, GCLP_HICON, (LONG_PTR)hClassIcon); RECT rcBtnBox = {0}; if (pArgs->aRecreate == cra_RecreateTab) { //GCC hack. иначе не собирается SetDlgItemTextA(hDlg, IDC_RESTART_MSG, "About to restart console"); SendDlgItemMessage(hDlg, IDC_RESTART_ICON, STM_SETICON, (WPARAM)LoadIcon(NULL,IDI_EXCLAMATION), 0); // Выровнять флажок по кнопке GetWindowRect(GetDlgItem(hDlg, IDC_START), &rcBtnBox); lbRc = TRUE; } else { //GCC hack. иначе не собирается SetDlgItemTextA(hDlg, IDC_RESTART_MSG, "Create new console"); // Если ВЫКЛЮЧЕН "Multi consoles in one window" // - Check & Disable "New window" checkbox CheckDlgButton(hDlg, cbRunInNewWindow, (pArgs->aRecreate == cra_CreateWindow || !gpSetCls->IsMulti()) ? BST_CHECKED : BST_UNCHECKED); EnableWindow(GetDlgItem(hDlg, cbRunInNewWindow), gpSetCls->IsMulti()); // SendDlgItemMessage(hDlg, IDC_RESTART_ICON, STM_SETICON, (WPARAM)LoadIcon(NULL,IDI_QUESTION), 0); POINT pt = {0,0}; MapWindowPoints(GetDlgItem(hDlg, IDC_TERMINATE), hDlg, &pt, 1); DestroyWindow(GetDlgItem(hDlg, IDC_TERMINATE)); SetWindowPos(GetDlgItem(hDlg, IDC_START), NULL, pt.x, pt.y, 0,0, SWP_NOSIZE|SWP_NOZORDER); SetDlgItemText(hDlg, IDC_START, (pArgs->aRecreate == cra_EditTab) ? L"&Save" : L"&Start"); DestroyWindow(GetDlgItem(hDlg, IDC_WARNING)); // Выровнять флажок по кнопке GetWindowRect(GetDlgItem(hDlg, IDC_START), &rcBtnBox); } if (rcBtnBox.left) { // Выровнять флажок по кнопке MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtnBox, 2); RECT rcBox; GetWindowRect(GetDlgItem(hDlg, cbRunAsAdmin), &rcBox); POINT pt; pt.x = rcBtnBox.left - (rcBox.right - rcBox.left) - 5; pt.y = rcBtnBox.top + ((rcBtnBox.bottom-rcBtnBox.top) - (rcBox.bottom-rcBox.top))/2; SetWindowPos(GetDlgItem(hDlg, cbRunAsAdmin), NULL, pt.x, pt.y, 0,0, SWP_NOSIZE|SWP_NOZORDER); } // Correct cbRunInNewWindow position if (!bRunInNewWindow_Hidden) { POINT pt = {}; MapWindowPoints(GetDlgItem(hDlg, cbRunAsAdmin), hDlg, &pt, 1); RECT rcBox2; GetWindowRect(GetDlgItem(hDlg, cbRunInNewWindow), &rcBox2); SetWindowPos(GetDlgItem(hDlg, cbRunInNewWindow), NULL, pt.x-(rcBox2.right-rcBox2.left), pt.y, 0,0, SWP_NOSIZE); } // Dpi aware processing at the end of sequence // because we done some manual control reposition if (mp_DpiAware) { mp_DpiAware->Attach(hDlg, ghWnd); } // Ensure, it will be "on screen" RECT rect; GetWindowRect(hDlg, &rect); RECT rcCenter = CenterInParent(rect, mh_Parent); MoveWindow(hDlg, rcCenter.left, rcCenter.top, rect.right - rect.left, rect.bottom - rect.top, false); // Была отключена обработка CConEmuMain::OnFocus (лишние телодвижения) PostMessage(hDlg, (WM_APP+1), 0,0); // Default focus control if (pArgs->aRecreate == cra_RecreateTab) SetFocus(GetDlgItem(hDlg, IDC_START)); // Win+~ (Recreate tab), Focus on "Restart" button" else if ((pArgs->pszUserName && *pArgs->pszUserName) && !*pArgs->szUserPassword) SetFocus(GetDlgItem(hDlg, tRunAsPassword)); // We need password, all other fields are ready else SetFocus(GetDlgItem(hDlg, IDC_RESTART_CMD)); // Set focus in command-line field return lbRc; }
bool CConEmuInside::GetInsideRect(RECT* prWnd) { RECT rcWnd = {}; if (m_InsideIntegration == ii_None) { _ASSERTE(m_InsideIntegration != ii_None); return false; } if (isParentIconic()) { return false; } RECT rcParent = {}, rcRelative = {}; GetClientRect(mh_InsideParentWND, &rcParent); if (m_InsideIntegration == ii_Simple) { rcWnd = rcParent; } else { RECT rcChild = {}; GetWindowRect(mh_InsideParentRel, &rcChild); MapWindowPoints(NULL, mh_InsideParentWND, (LPPOINT)&rcChild, 2); IntersectRect(&rcRelative, &rcParent, &rcChild); // WinXP & Win2k3 if (gnOsVer < 0x600) { rcWnd = rcRelative; } // Windows 7 else if ((rcParent.bottom - rcRelative.bottom) >= 100) { // Предпочтительно // Далее - ветвимся по OS if (gnOsVer < 0x600) { rcWnd = MakeRect(rcRelative.left, rcRelative.bottom + 4, rcParent.right, rcParent.bottom); } else { rcWnd = MakeRect(rcParent.left, rcRelative.bottom + 4, rcParent.right, rcParent.bottom); } } else if ((rcParent.right - rcRelative.right) >= 200) { rcWnd = MakeRect(rcRelative.right + 4, rcRelative.top, rcParent.right, rcRelative.bottom); } else { TODO("Другие системы и проверки на валидность"); rcWnd = MakeRect(rcParent.left, rcParent.bottom - 100, rcParent.right, rcParent.bottom); } } if (prWnd) *prWnd = rcWnd; return true; }
HBITMAP Explorerplusplus::CaptureTabScreenshot(int iTabId) { HDC hdc; HDC hdcSrc; HBITMAP hBitmap; HBITMAP hPrevBitmap; Gdiplus::Color color(0,0,0); RECT rcMain; RECT rcTab; HWND hTab = m_hListView[iTabId]; GetClientRect(m_hContainer,&rcMain); GetClientRect(hTab,&rcTab); /* Main window BitBlt. */ hdc = GetDC(m_hContainer); hdcSrc = CreateCompatibleDC(hdc); /* Any bitmap sent back to the operating system will need to be in 32-bit ARGB format. */ Gdiplus::Bitmap bi(GetRectWidth(&rcMain),GetRectHeight(&rcMain),PixelFormat32bppARGB); bi.GetHBITMAP(color,&hBitmap); /* BitBlt the main window into the bitmap. */ hPrevBitmap = (HBITMAP)SelectObject(hdcSrc,hBitmap); BitBlt(hdcSrc,0,0,GetRectWidth(&rcMain),GetRectHeight(&rcMain),hdc,0,0,SRCCOPY); /* Now BitBlt the tab onto the main window. */ HDC hdcTab; HDC hdcTabSrc; HBITMAP hbmTab; HBITMAP hbmTabPrev; BOOL bVisible; hdcTab = GetDC(hTab); hdcTabSrc = CreateCompatibleDC(hdcTab); hbmTab = CreateCompatibleBitmap(hdcTab,GetRectWidth(&rcTab),GetRectHeight(&rcTab)); hbmTabPrev = (HBITMAP)SelectObject(hdcTabSrc,hbmTab); bVisible = IsWindowVisible(hTab); if(!bVisible) { ShowWindow(hTab,SW_SHOW); } PrintWindow(hTab,hdcTabSrc,PW_CLIENTONLY); if(!bVisible) { ShowWindow(hTab,SW_HIDE); } MapWindowPoints(hTab,m_hContainer,(LPPOINT)&rcTab,2); BitBlt(hdcSrc,rcTab.left,rcTab.top,GetRectWidth(&rcTab),GetRectHeight(&rcTab),hdcTabSrc,0,0,SRCCOPY); SelectObject(hdcTabSrc,hbmTabPrev); DeleteObject(hbmTab); DeleteDC(hdcTabSrc); ReleaseDC(hTab,hdcTab); /* Shrink the bitmap. */ HDC hdcThumbnailSrc; HBITMAP hbmThumbnail; POINT pt; hdcThumbnailSrc = CreateCompatibleDC(hdc); /* Thumbnail bitmap. */ Gdiplus::Bitmap bmpThumbnail(GetRectWidth(&rcMain),GetRectHeight(&rcMain),PixelFormat32bppARGB); bmpThumbnail.GetHBITMAP(color,&hbmThumbnail); hPrevBitmap = (HBITMAP)SelectObject(hdcThumbnailSrc,hbmThumbnail); /* Finally, shrink the full-scale bitmap down into a thumbnail. */ SetStretchBltMode(hdcThumbnailSrc,HALFTONE); SetBrushOrgEx(hdcThumbnailSrc,0,0,&pt); BitBlt(hdcThumbnailSrc,0,0,GetRectWidth(&rcMain),GetRectHeight(&rcMain),hdcSrc,0,0,SRCCOPY); SetBitmapDimensionEx(hbmThumbnail,GetRectWidth(&rcMain),GetRectHeight(&rcMain),NULL); SelectObject(hdcThumbnailSrc,hPrevBitmap); DeleteDC(hdcThumbnailSrc); DeleteObject(hBitmap); SelectObject(hdcSrc,hPrevBitmap); DeleteDC(hdcSrc); ReleaseDC(m_hContainer,hdc); return hbmThumbnail; }
/* * This function tries to determine the icon geometry from the tray * * If it fails an invalid rect is returned. */ QRect QSystemTrayIconSys::findIconGeometry(const int iconId) { static PtrShell_NotifyIconGetRect Shell_NotifyIconGetRect = (PtrShell_NotifyIconGetRect)QSystemLibrary::resolve(QLatin1String("shell32"), "Shell_NotifyIconGetRect"); if (Shell_NotifyIconGetRect) { Q_NOTIFYICONIDENTIFIER nid; memset(&nid, 0, sizeof(nid)); nid.cbSize = sizeof(nid); nid.hWnd = winId(); nid.uID = iconId; RECT rect; HRESULT hr = Shell_NotifyIconGetRect(&nid, &rect); if (SUCCEEDED(hr)) { return QRect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); } } QRect ret; TBBUTTON buttonData; DWORD processID = 0; HWND trayHandle = FindWindow(L"Shell_TrayWnd", NULL); //find the toolbar used in the notification area if (trayHandle) { trayHandle = FindWindowEx(trayHandle, NULL, L"TrayNotifyWnd", NULL); if (trayHandle) { HWND hwnd = FindWindowEx(trayHandle, NULL, L"SysPager", NULL); if (hwnd) { hwnd = FindWindowEx(hwnd, NULL, L"ToolbarWindow32", NULL); if (hwnd) trayHandle = hwnd; } } } if (!trayHandle) return ret; GetWindowThreadProcessId(trayHandle, &processID); if (processID <= 0) return ret; HANDLE trayProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, 0, processID); if (!trayProcess) return ret; int buttonCount = SendMessage(trayHandle, TB_BUTTONCOUNT, 0, 0); LPVOID data = VirtualAllocEx(trayProcess, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE); if ( buttonCount < 1 || !data ) { CloseHandle(trayProcess); return ret; } //search for our icon among all toolbar buttons for (int toolbarButton = 0; toolbarButton < buttonCount; ++toolbarButton ) { SIZE_T numBytes = 0; DWORD appData[2] = { 0, 0 }; SendMessage(trayHandle, TB_GETBUTTON, toolbarButton , (LPARAM)data); if (!ReadProcessMemory(trayProcess, data, &buttonData, sizeof(TBBUTTON), &numBytes)) continue; if (!ReadProcessMemory(trayProcess, (LPVOID) buttonData.dwData, appData, sizeof(appData), &numBytes)) continue; int currentIconId = appData[1]; HWND currentIconHandle = (HWND) appData[0]; bool isHidden = buttonData.fsState & TBSTATE_HIDDEN; if (currentIconHandle == winId() && currentIconId == iconId && !isHidden) { SendMessage(trayHandle, TB_GETITEMRECT, toolbarButton , (LPARAM)data); RECT iconRect = {0, 0}; if(ReadProcessMemory(trayProcess, data, &iconRect, sizeof(RECT), &numBytes)) { MapWindowPoints(trayHandle, NULL, (LPPOINT)&iconRect, 2); QRect geometry(iconRect.left + 1, iconRect.top + 1, iconRect.right - iconRect.left - 2, iconRect.bottom - iconRect.top - 2); if (geometry.isValid()) ret = geometry; break; } } } VirtualFreeEx(trayProcess, data, 0, MEM_RELEASE); CloseHandle(trayProcess); return ret; }
bool CConEmuInside::InsideFindShellView(HWND hFrom) { wchar_t szClass[128]; wchar_t szParent[128]; wchar_t szRoot[128]; HWND hChild = NULL; // Для WinXP HWND hXpView = NULL, hXpPlace = NULL; while ((hChild = FindWindowEx(hFrom, hChild, NULL, NULL)) != NULL) { // Нас интересуют только видимые окна! if (!IsWindowVisible(hChild)) continue; // Windows 7, Windows 8. GetClassName(hChild, szClass, countof(szClass)); if (lstrcmp(szClass, L"SHELLDLL_DefView") == 0) { GetClassName(hFrom, szParent, countof(szParent)); if (lstrcmp(szParent, L"CtrlNotifySink") == 0) { HWND hParent = GetParent(hFrom); if (hParent) { GetClassName(hParent, szRoot, countof(szRoot)); _ASSERTE(lstrcmp(szRoot, L"DirectUIHWND") == 0); SetInsideParentWND(hParent); mh_InsideParentRel = hFrom; m_InsideIntegration = ii_Explorer; return true; } } else if ((gnOsVer < 0x600) && (lstrcmp(szParent, L"ExploreWClass") == 0)) { _ASSERTE(mh_InitialRoot == hFrom); hXpView = hChild; } } else if ((gnOsVer < 0x600) && (lstrcmp(szClass, L"BaseBar") == 0)) { RECT rcBar = {}; GetWindowRect(hChild, &rcBar); MapWindowPoints(NULL, hFrom, (LPPOINT)&rcBar, 2); RECT rcParent = {}; GetClientRect(hFrom, &rcParent); if ((-10 <= (rcBar.right - rcParent.right)) && ((rcBar.right - rcParent.right) <= 10)) { // Нас интересует область, прилепленная к правому-нижнему углу hXpPlace = hChild; } } // Путь в этом (hChild) хранится в формате "Address: D:\users\max" else if ((gnOsVer >= 0x600) && lstrcmp(szClass, L"ToolbarWindow32") == 0) { GetClassName(hFrom, szParent, countof(szParent)); if (lstrcmp(szParent, L"Breadcrumb Parent") == 0) { HWND hParent = GetParent(hFrom); if (hParent) { GetClassName(hParent, szRoot, countof(szRoot)); _ASSERTE(lstrcmp(szRoot, L"msctls_progress32") == 0); mh_InsideParentPath = hChild; // Остается ComboBox/Edit, в который можно запихнуть путь, чтобы заставить эксплорер по нему перейти // Но есть проблема. Этот контрол не создается при открытии окна! return true; } } } if ((hChild != hXpView) && (hChild != hXpPlace)) { if (InsideFindShellView(hChild)) { if (mh_InsideParentRel && mh_InsideParentPath) return true; else break; } } if (hXpView && hXpPlace) { mh_InsideParentRel = FindWindowEx(hXpPlace, NULL, L"ReBarWindow32", NULL); if (!mh_InsideParentRel) { _ASSERTE(mh_InsideParentRel && L"ReBar must be found on XP & 2k3"); return true; // закончить поиск } SetInsideParentWND(hXpPlace); _ASSERTE(mh_InsideParentWND!=NULL); HWND hRoot = GetParentRoot(); _ASSERTE(mh_InsideParentPath==NULL || mh_InsideParentPath==hRoot); mh_InsideParentPath = hRoot; m_InsideIntegration = ii_Explorer; return true; } } return false; }
static Bool winAllocateFBPrimaryDD(ScreenPtr pScreen) { winScreenPriv(pScreen); winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; HRESULT ddrval = DD_OK; DDSURFACEDESC ddsd; DDSURFACEDESC *pddsdPrimary = NULL; DDSURFACEDESC *pddsdOffscreen = NULL; RECT rcClient; winDebug ("winAllocateFBPrimaryDD\n"); /* Get client area location in screen coords */ GetClientRect(pScreenPriv->hwndScreen, &rcClient); MapWindowPoints(pScreenPriv->hwndScreen, HWND_DESKTOP, (LPPOINT) &rcClient, 2); /* Create a DirectDraw object, store the address at lpdd */ ddrval = (*g_fpDirectDrawCreate) (NULL, &pScreenPriv->pdd, NULL); if (ddrval != DD_OK) FatalError("winAllocateFBPrimaryDD - Could not start DirectDraw\n"); /* Get a DirectDraw2 interface pointer */ ddrval = IDirectDraw_QueryInterface(pScreenPriv->pdd, &IID_IDirectDraw2, (LPVOID *) &pScreenPriv->pdd2); if (FAILED(ddrval)) { ErrorF("winAllocateFBShadowDD - Failed DD2 query: %08x\n", (unsigned int) ddrval); return FALSE; } winDebug ("winAllocateFBPrimaryDD - Created and initialized DD\n"); /* Are we windowed or fullscreen? */ if (pScreenInfo->fFullScreen) { /* Full screen mode */ ddrval = IDirectDraw2_SetCooperativeLevel(pScreenPriv->pdd2, pScreenPriv->hwndScreen, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE); if (FAILED(ddrval)) FatalError("winAllocateFBPrimaryDD - Could not set " "cooperative level\n"); /* Change the video mode to the mode requested */ ddrval = IDirectDraw2_SetDisplayMode(pScreenPriv->pdd2, pScreenInfo->dwWidth, pScreenInfo->dwHeight, pScreenInfo->dwBPP, pScreenInfo->dwRefreshRate, 0); if (FAILED(ddrval)) FatalError("winAllocateFBPrimaryDD - Could not set " "full screen display mode\n"); } else { /* Windowed mode */ ddrval = IDirectDraw2_SetCooperativeLevel(pScreenPriv->pdd2, pScreenPriv->hwndScreen, DDSCL_NORMAL); if (FAILED(ddrval)) FatalError("winAllocateFBPrimaryDD - Could not set " "cooperative level\n"); } /* Describe the primary surface */ ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; /* Create the primary surface */ ddrval = IDirectDraw2_CreateSurface(pScreenPriv->pdd2, &ddsd, &pScreenPriv->pddsPrimary, NULL); if (FAILED(ddrval)) FatalError("winAllocateFBPrimaryDD - Could not create primary " "surface %08x\n", (unsigned int) ddrval); winDebug ("winAllocateFBPrimaryDD - Created primary\n"); /* Allocate a DD surface description for our screen privates */ pddsdPrimary = pScreenPriv->pddsdPrimary = malloc(sizeof(DDSURFACEDESC)); if (pddsdPrimary == NULL) FatalError("winAllocateFBPrimaryDD - Could not allocate surface " "description memory\n"); ZeroMemory(pddsdPrimary, sizeof(*pddsdPrimary)); pddsdPrimary->dwSize = sizeof(*pddsdPrimary); /* Describe the offscreen surface to be created */ /* * NOTE: Do not use a DDSCAPS_VIDEOMEMORY surface, * as drawing, locking, and unlocking take forever * with video memory surfaces. In addition, * video memory is a somewhat scarce resource, * so you shouldn't be allocating video memory when * you have the option of using system memory instead. */ ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; ddsd.dwHeight = pScreenInfo->dwHeight; ddsd.dwWidth = pScreenInfo->dwWidth; /* Create the shadow surface */ ddrval = IDirectDraw2_CreateSurface(pScreenPriv->pdd2, &ddsd, &pScreenPriv->pddsOffscreen, NULL); if (ddrval != DD_OK) FatalError("winAllocateFBPrimaryDD - Could not create shadow " "surface\n"); winDebug ("winAllocateFBPrimaryDD - Created offscreen\n"); /* Allocate a DD surface description for our screen privates */ pddsdOffscreen = pScreenPriv->pddsdOffscreen = malloc(sizeof(DDSURFACEDESC)); if (pddsdOffscreen == NULL) FatalError("winAllocateFBPrimaryDD - Could not allocate surface " "description memory\n"); ZeroMemory(pddsdOffscreen, sizeof(*pddsdOffscreen)); pddsdOffscreen->dwSize = sizeof(*pddsdOffscreen); winDebug ("winAllocateFBPrimaryDD - Locking primary\n"); /* Lock the primary surface */ ddrval = IDirectDrawSurface2_Lock(pScreenPriv->pddsPrimary, pScreenInfo-> fFullScreen ? NULL : &rcClient, pddsdPrimary, DDLOCK_WAIT, NULL); if (ddrval != DD_OK || pddsdPrimary->lpSurface == NULL) FatalError("winAllocateFBPrimaryDD - Could not lock " "primary surface\n"); winDebug ("winAllocateFBPrimaryDD - Locked primary\n"); /* We don't know how to deal with anything other than RGB */ if (!(pddsdPrimary->ddpfPixelFormat.dwFlags & DDPF_RGB)) FatalError("winAllocateFBPrimaryDD - Color format other than RGB\n"); /* Grab the pitch from the surface desc */ pScreenInfo->dwStride = (pddsdPrimary->u1.lPitch * 8) / pScreenInfo->dwBPP; /* Save the pointer to our surface memory */ pScreenInfo->pfb = pddsdPrimary->lpSurface; /* Grab the color depth and masks from the surface description */ pScreenPriv->dwRedMask = pddsdPrimary->ddpfPixelFormat.u2.dwRBitMask; pScreenPriv->dwGreenMask = pddsdPrimary->ddpfPixelFormat.u3.dwGBitMask; pScreenPriv->dwBlueMask = pddsdPrimary->ddpfPixelFormat.u4.dwBBitMask; winDebug ("winAllocateFBPrimaryDD - Returning\n"); return TRUE; }
static Bool winHotKeyAltTabPrimaryDD(ScreenPtr pScreen) { winScreenPriv(pScreen); winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; RECT rcClient, rcSrc; HRESULT ddrval = DD_OK; winDebug ("\nwinHotKeyAltTabPrimaryDD\n\n"); /* Alt+Tab was pressed, we will lose focus very soon */ pScreenPriv->fActive = FALSE; /* Check for error conditions */ if (pScreenPriv->pddsPrimary == NULL || pScreenPriv->pddsOffscreen == NULL) return FALSE; /* Get client area in screen coords */ GetClientRect(pScreenPriv->hwndScreen, &rcClient); MapWindowPoints(pScreenPriv->hwndScreen, HWND_DESKTOP, (LPPOINT) &rcClient, 2); /* Did we loose the primary surface? */ ddrval = IDirectDrawSurface2_IsLost(pScreenPriv->pddsPrimary); if (ddrval == DD_OK) { ddrval = IDirectDrawSurface2_Unlock(pScreenPriv->pddsPrimary, NULL); if (FAILED(ddrval)) FatalError("winHotKeyAltTabPrimaryDD - Failed unlocking primary " "surface\n"); } /* Setup a source rectangle */ rcSrc.left = 0; rcSrc.top = 0; rcSrc.right = pScreenInfo->dwWidth; rcSrc.bottom = pScreenInfo->dwHeight; /* Blit the primary surface to the offscreen surface */ ddrval = IDirectDrawSurface2_Blt(pScreenPriv->pddsOffscreen, NULL, /* should be rcDest */ pScreenPriv->pddsPrimary, NULL, DDBLT_WAIT, NULL); if (ddrval == DDERR_SURFACELOST) { IDirectDrawSurface2_Restore(pScreenPriv->pddsOffscreen); IDirectDrawSurface2_Restore(pScreenPriv->pddsPrimary); /* Blit the primary surface to the offscreen surface */ ddrval = IDirectDrawSurface2_Blt(pScreenPriv->pddsOffscreen, NULL, pScreenPriv->pddsPrimary, NULL, DDBLT_WAIT, NULL); if (FAILED(ddrval)) FatalError("winHotKeyAltTabPrimaryDD - Failed blitting primary " "surface to offscreen surface: %08x\n", (unsigned int) ddrval); } else { FatalError("winHotKeyAltTabPrimaryDD - Unknown error from " "Blt: %08dx\n", (unsigned int) ddrval); } /* Lock the offscreen surface */ ddrval = IDirectDrawSurface2_Lock(pScreenPriv->pddsOffscreen, NULL, pScreenPriv->pddsdOffscreen, DDLOCK_WAIT, NULL); if (ddrval != DD_OK || pScreenPriv->pddsdPrimary->lpSurface == NULL) FatalError("winHotKeyAltTabPrimaryDD - Could not lock " "offscreen surface\n"); /* Notify FB of the new memory pointer */ winUpdateFBPointer(pScreen, pScreenPriv->pddsdOffscreen->lpSurface); /* Unregister our hotkey */ UnregisterHotKey(pScreenPriv->hwndScreen, 1); return TRUE; }
static Bool winActivateAppPrimaryDD(ScreenPtr pScreen) { winScreenPriv(pScreen); RECT rcSrc, rcClient; HRESULT ddrval = DD_OK; /* Check for errors */ if (pScreenPriv == NULL || pScreenPriv->pScreenInfo == NULL || pScreenPriv->pddsPrimary == NULL || pScreenPriv->pddsOffscreen == NULL) return FALSE; /* Check for do-nothing */ if (!pScreenPriv->fActive) return TRUE; /* We are activating */ ddrval = IDirectDrawSurface2_IsLost(pScreenPriv->pddsOffscreen); if (ddrval == DD_OK) { IDirectDrawSurface2_Unlock(pScreenPriv->pddsOffscreen, NULL); /* * We don't check for an error from Unlock, because it * doesn't matter if the Unlock failed. */ } /* Restore both surfaces, just cause I like it that way */ IDirectDrawSurface2_Restore(pScreenPriv->pddsOffscreen); IDirectDrawSurface2_Restore(pScreenPriv->pddsPrimary); /* Get client area in screen coords */ GetClientRect(pScreenPriv->hwndScreen, &rcClient); MapWindowPoints(pScreenPriv->hwndScreen, HWND_DESKTOP, (LPPOINT) &rcClient, 2); /* Setup a source rectangle */ rcSrc.left = 0; rcSrc.top = 0; rcSrc.right = pScreenPriv->pScreenInfo->dwWidth; rcSrc.bottom = pScreenPriv->pScreenInfo->dwHeight; ddrval = IDirectDrawSurface2_Blt(pScreenPriv->pddsPrimary, &rcClient, pScreenPriv->pddsOffscreen, &rcSrc, DDBLT_WAIT, NULL); if (ddrval != DD_OK) FatalError("winActivateAppPrimaryDD () - Failed blitting offscreen " "surface to primary surface %08x\n", (unsigned int) ddrval); /* Lock the primary surface */ ddrval = IDirectDrawSurface2_Lock(pScreenPriv->pddsPrimary, &rcClient, pScreenPriv->pddsdPrimary, DDLOCK_WAIT, NULL); if (ddrval != DD_OK || pScreenPriv->pddsdPrimary->lpSurface == NULL) FatalError("winActivateAppPrimaryDD () - Could not lock " "primary surface\n"); /* Notify FB of the new memory pointer */ winUpdateFBPointer(pScreen, pScreenPriv->pddsdPrimary->lpSurface); /* * Register the Alt-Tab combo as a hotkey so we can copy * the primary framebuffer before the display mode changes */ RegisterHotKey(pScreenPriv->hwndScreen, 1, MOD_ALT, 9); return TRUE; }
INT_PTR CALLBACK EtpGpuNodesDlgProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: { ULONG i; HFONT font; PPH_STRING nodeString; RECT labelRect; RECT tempRect; ULONG numberOfRows; ULONG numberOfColumns; WindowHandle = hwndDlg; PhCenterWindow(hwndDlg, GetParent(hwndDlg)); PhInitializeLayoutManager(&LayoutManager, hwndDlg); PhAddLayoutItem(&LayoutManager, GetDlgItem(hwndDlg, IDOK), NULL, PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM); LayoutMargin = PhAddLayoutItem(&LayoutManager, GetDlgItem(hwndDlg, IDC_LAYOUT), NULL, PH_ANCHOR_ALL)->Margin; PhRegisterCallback(&PhProcessesUpdatedEvent, ProcessesUpdatedCallback, NULL, &ProcessesUpdatedCallbackRegistration); GraphHandle = PhAllocate(sizeof(HWND) * EtGpuTotalNodeCount); CheckBoxHandle = PhAllocate(sizeof(HWND) * EtGpuTotalNodeCount); GraphState = PhAllocate(sizeof(PH_GRAPH_STATE) * EtGpuTotalNodeCount); font = (HFONT)SendMessage(hwndDlg, WM_GETFONT, 0, 0); for (i = 0; i < EtGpuTotalNodeCount; i++) { nodeString = PhFormatString(L"Node %lu", i); GraphHandle[i] = CreateWindow( PH_GRAPH_CLASSNAME, NULL, WS_VISIBLE | WS_CHILD | WS_BORDER, 0, 0, 3, 3, hwndDlg, NULL, NULL, NULL ); Graph_SetTooltip(GraphHandle[i], TRUE); CheckBoxHandle[i] = CreateWindow( WC_BUTTON, nodeString->Buffer, WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, 0, 0, 3, 3, hwndDlg, NULL, NULL, NULL ); SendMessage(CheckBoxHandle[i], WM_SETFONT, (WPARAM)font, FALSE); PhInitializeGraphState(&GraphState[i]); PhDereferenceObject(nodeString); } // Calculate the minimum size. numberOfRows = (ULONG)sqrt(EtGpuTotalNodeCount); numberOfColumns = (EtGpuTotalNodeCount + numberOfRows - 1) / numberOfRows; MinimumSize.left = 0; MinimumSize.top = 0; MinimumSize.right = 45; MinimumSize.bottom = 60; MapDialogRect(hwndDlg, &MinimumSize); MinimumSize.right += (MinimumSize.right + GRAPH_PADDING) * numberOfColumns; MinimumSize.bottom += (MinimumSize.bottom + GRAPH_PADDING) * numberOfRows; GetWindowRect(GetDlgItem(hwndDlg, IDC_INSTRUCTION), &labelRect); MapWindowPoints(NULL, hwndDlg, (POINT *)&labelRect, 2); labelRect.right += GetSystemMetrics(SM_CXFRAME) * 2; tempRect.left = 0; tempRect.top = 0; tempRect.right = 7; tempRect.bottom = 0; MapDialogRect(hwndDlg, &tempRect); labelRect.right += tempRect.right; if (MinimumSize.right < labelRect.right) MinimumSize.right = labelRect.right; SetWindowPos(hwndDlg, NULL, 0, 0, MinimumSize.right, MinimumSize.bottom, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); EtpLoadNodeBitMap(); } break; case WM_DESTROY: { ULONG i; EtpSaveNodeBitMap(); PhUnregisterCallback(&PhProcessesUpdatedEvent, &ProcessesUpdatedCallbackRegistration); for (i = 0; i < EtGpuTotalNodeCount; i++) { PhDeleteGraphState(&GraphState[i]); } PhFree(GraphHandle); PhFree(CheckBoxHandle); PhFree(GraphState); PhDeleteLayoutManager(&LayoutManager); } break; case WM_SIZE: { HDWP deferHandle; RECT clientRect; RECT checkBoxRect; ULONG numberOfRows = (ULONG)sqrt(EtGpuTotalNodeCount); ULONG numberOfColumns = (EtGpuTotalNodeCount + numberOfRows - 1) / numberOfRows; ULONG numberOfYPaddings = numberOfRows - 1; ULONG numberOfXPaddings = numberOfColumns - 1; ULONG cellHeight; ULONG y; ULONG cellWidth; ULONG x; ULONG i; PhLayoutManagerLayout(&LayoutManager); deferHandle = BeginDeferWindowPos(EtGpuTotalNodeCount * 2); GetClientRect(hwndDlg, &clientRect); GetClientRect(GetDlgItem(hwndDlg, IDC_EXAMPLE), &checkBoxRect); cellHeight = (clientRect.bottom - LayoutMargin.top - LayoutMargin.bottom - GRAPH_PADDING * numberOfYPaddings) / numberOfRows; y = LayoutMargin.top; i = 0; for (ULONG row = 0; row < numberOfRows; ++row) { // Give the last row the remaining space; the height we calculated might be off by a few // pixels due to integer division. if (row == numberOfRows - 1) cellHeight = clientRect.bottom - LayoutMargin.bottom - y; cellWidth = (clientRect.right - LayoutMargin.left - LayoutMargin.right - GRAPH_PADDING * numberOfXPaddings) / numberOfColumns; x = LayoutMargin.left; for (ULONG column = 0; column < numberOfColumns; column++) { // Give the last cell the remaining space; the width we calculated might be off by a few // pixels due to integer division. if (column == numberOfColumns - 1) cellWidth = clientRect.right - LayoutMargin.right - x; if (i < EtGpuTotalNodeCount) { deferHandle = DeferWindowPos( deferHandle, GraphHandle[i], NULL, x, y, cellWidth, cellHeight - checkBoxRect.bottom - CHECKBOX_PADDING, SWP_NOACTIVATE | SWP_NOZORDER ); deferHandle = DeferWindowPos( deferHandle, CheckBoxHandle[i], NULL, x, y + cellHeight - checkBoxRect.bottom, cellWidth, checkBoxRect.bottom, SWP_NOACTIVATE | SWP_NOZORDER ); i++; } x += cellWidth + GRAPH_PADDING; } y += cellHeight + GRAPH_PADDING; } EndDeferWindowPos(deferHandle); } break; case WM_SIZING: { PhResizingMinimumSize((PRECT)lParam, wParam, MinimumSize.right, MinimumSize.bottom); } break; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDCANCEL: case IDOK: { EndDialog(hwndDlg, IDOK); } break; } } break; case WM_NOTIFY: { NMHDR *header = (NMHDR *)lParam; ULONG i; switch (header->code) { case GCN_GETDRAWINFO: { PPH_GRAPH_GETDRAWINFO getDrawInfo = (PPH_GRAPH_GETDRAWINFO)header; PPH_GRAPH_DRAW_INFO drawInfo = getDrawInfo->DrawInfo; drawInfo->Flags = PH_GRAPH_USE_GRID; SysInfoParameters->ColorSetupFunction(drawInfo, PhGetIntegerSetting(L"ColorCpuKernel"), 0); for (i = 0; i < EtGpuTotalNodeCount; i++) { if (header->hwndFrom == GraphHandle[i]) { PhGraphStateGetDrawInfo( &GraphState[i], getDrawInfo, EtGpuNodesHistory[i].Count ); if (!GraphState[i].Valid) { PhCopyCircularBuffer_FLOAT(&EtGpuNodesHistory[i], GraphState[i].Data1, drawInfo->LineDataCount); GraphState[i].Valid = TRUE; } break; } } } break; case GCN_GETTOOLTIPTEXT: { PPH_GRAPH_GETTOOLTIPTEXT getTooltipText = (PPH_GRAPH_GETTOOLTIPTEXT)header; if (getTooltipText->Index < getTooltipText->TotalCount) { for (i = 0; i < EtGpuTotalNodeCount; i++) { if (header->hwndFrom == GraphHandle[i]) { if (GraphState[i].TooltipIndex != getTooltipText->Index) { FLOAT gpu; ULONG adapterIndex; PPH_STRING adapterDescription; gpu = PhGetItemCircularBuffer_FLOAT(&EtGpuNodesHistory[i], getTooltipText->Index); adapterIndex = EtGetGpuAdapterIndexFromNodeIndex(i); if (adapterIndex != -1) { adapterDescription = EtGetGpuAdapterDescription(adapterIndex); if (adapterDescription && adapterDescription->Length == 0) PhClearReference(&adapterDescription); if (!adapterDescription) adapterDescription = PhFormatString(L"Adapter %lu", adapterIndex); } else { adapterDescription = PhCreateString(L"Unknown Adapter"); } PhMoveReference(&GraphState[i].TooltipText, PhFormatString( L"Node %lu on %s\n%.2f%%\n%s", i, adapterDescription->Buffer, gpu * 100, ((PPH_STRING)PhAutoDereferenceObject(PhGetStatisticsTimeString(NULL, getTooltipText->Index)))->Buffer )); PhDereferenceObject(adapterDescription); } getTooltipText->Text = GraphState[i].TooltipText->sr; break; } } } } break; } } break; case UPDATE_MSG: { ULONG i; for (i = 0; i < EtGpuTotalNodeCount; i++) { GraphState[i].Valid = FALSE; GraphState[i].TooltipIndex = -1; Graph_MoveGrid(GraphHandle[i], 1); Graph_Draw(GraphHandle[i]); Graph_UpdateTooltip(GraphHandle[i]); InvalidateRect(GraphHandle[i], NULL, FALSE); } } break; } return FALSE; }
/* It is up to the caller to delete the bitmap returned by this method. */ void Explorerplusplus::GetTabLivePreviewBitmap(int iTabId,TabPreviewInfo_t *ptpi) { HDC hdcTab; HDC hdcTabSrc; HBITMAP hbmTab; HBITMAP hbmTabPrev; Gdiplus::Color color(0,0,0); MENUBARINFO mbi; POINT pt; BOOL bVisible; RECT rcTab; HWND hTab = m_hListView[iTabId]; hdcTab = GetDC(hTab); hdcTabSrc = CreateCompatibleDC(hdcTab); GetClientRect(hTab,&rcTab); Gdiplus::Bitmap bi(GetRectWidth(&rcTab),GetRectHeight(&rcTab),PixelFormat32bppARGB); bi.GetHBITMAP(color,&hbmTab); hbmTabPrev = (HBITMAP)SelectObject(hdcTabSrc,hbmTab); bVisible = IsWindowVisible(hTab); if(!bVisible) { ShowWindow(hTab,SW_SHOW); } PrintWindow(hTab,hdcTabSrc,PW_CLIENTONLY); if(!bVisible) { ShowWindow(hTab,SW_HIDE); } SetStretchBltMode(hdcTabSrc,HALFTONE); SetBrushOrgEx(hdcTabSrc,0,0,&pt); StretchBlt(hdcTabSrc,0,0,GetRectWidth(&rcTab),GetRectHeight(&rcTab),hdcTabSrc, 0,0,GetRectWidth(&rcTab),GetRectHeight(&rcTab),SRCCOPY); MapWindowPoints(hTab,m_hContainer,(LPPOINT)&rcTab,2); mbi.cbSize = sizeof(mbi); GetMenuBarInfo(m_hContainer,OBJID_MENU,0,&mbi); /* The operating system will automatically draw the main window. Therefore, we'll just shift the tab into it's proper position. */ ptpi->ptOrigin.x = rcTab.left; /* Need to include the menu bar in the offset. */ ptpi->ptOrigin.y = rcTab.top + mbi.rcBar.bottom - mbi.rcBar.top; ptpi->hbm = hbmTab; ptpi->iTabId = iTabId; SelectObject(hdcTabSrc,hbmTabPrev); DeleteDC(hdcTabSrc); ReleaseDC(hTab,hdcTab); }
bool Win32Window::takeScreenshot(uint8_t *pixelData) { if (mIsVisible) { return false; } bool error = false; // Hack for DWM: There is no way to wait for DWM animations to finish, so we just have to wait // for a while before issuing screenshot if window was just made visible. { static const double WAIT_WINDOW_VISIBLE_MS = 0.5; // Half a second for the animation double timeSinceVisible = mSetVisibleTimer->getElapsedTime(); if (timeSinceVisible < WAIT_WINDOW_VISIBLE_MS) { Sleep(static_cast<DWORD>((WAIT_WINDOW_VISIBLE_MS - timeSinceVisible) * 1000)); } } HDC screenDC = nullptr; HDC windowDC = nullptr; HDC tmpDC = nullptr; HBITMAP tmpBitmap = nullptr; if (!error) { screenDC = GetDC(nullptr); error = screenDC == nullptr; } if (!error) { windowDC = GetDC(mNativeWindow); error = windowDC == nullptr; } if (!error) { tmpDC = CreateCompatibleDC(screenDC); error = tmpDC == nullptr; } if (!error) { tmpBitmap = CreateCompatibleBitmap(screenDC, mWidth, mHeight); error = tmpBitmap == nullptr; } RECT rect = {0, 0, 0, 0}; if (!error) { MapWindowPoints(mNativeWindow, nullptr, reinterpret_cast<LPPOINT>(&rect), 0); error = SelectObject(tmpDC, tmpBitmap) == nullptr; } if (!error) { error = BitBlt(tmpDC, 0, 0, mWidth, mHeight, screenDC, rect.left, rect.top, SRCCOPY) == TRUE; } if (!error) { BITMAPINFOHEADER bitmapInfo; bitmapInfo.biSize = sizeof(BITMAPINFOHEADER); bitmapInfo.biWidth = mWidth; bitmapInfo.biHeight = -mHeight; bitmapInfo.biPlanes = 1; bitmapInfo.biBitCount = 32; bitmapInfo.biCompression = BI_RGB; bitmapInfo.biSizeImage = 0; bitmapInfo.biXPelsPerMeter = 0; bitmapInfo.biYPelsPerMeter = 0; bitmapInfo.biClrUsed = 0; bitmapInfo.biClrImportant = 0; int getBitsResult = GetDIBits(screenDC, tmpBitmap, 0, mHeight, pixelData, reinterpret_cast<BITMAPINFO*>(&bitmapInfo), DIB_RGB_COLORS); error = getBitsResult != 0; } if (tmpBitmap != nullptr) { DeleteObject(tmpBitmap); } if (tmpDC != nullptr) { DeleteDC(tmpDC); } if (screenDC != nullptr) { ReleaseDC(nullptr, screenDC); } if (windowDC != nullptr) { ReleaseDC(mNativeWindow, windowDC); } return !error; }
/* internal version of ExtTextOut, passed flags for text data type*/ static BOOL MwExtTextOut(HDC hdc, int x, int y, UINT fuOptions, CONST RECT *lprc, LPCVOID lpszString, UINT cbCount, CONST INT *lpDx, int flags) { HWND hwnd; POINT pt; RECT rc; hwnd = MwPrepareDC(hdc); if(!hwnd) return FALSE; pt.x = x; pt.y = y; if(MwIsClientDC(hdc)) ClientToScreen(hwnd, &pt); /* optionally fill passed rectangle*/ if(lprc && (fuOptions&ETO_OPAQUE)) { rc = *lprc; if(MwIsClientDC(hdc)) MapWindowPoints(hwnd, NULL, (LPPOINT)&rc, 2); /* fill rectangle with current background color*/ GdSetForegroundColor(hdc->psd, hdc->bkcolor); GdFillRect(hdc->psd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); GdSetUseBackground(FALSE); } else { /* use current background mode for text background draw*/ GdSetUseBackground(hdc->bkmode == OPAQUE? TRUE: FALSE); /* always set background color in case GdArea is * used to draw, which compares gr_foreground != gr_background * if gr_usebg is false... */ /*if(hdc->bkmode == OPAQUE)*/ GdSetBackgroundColor(hdc->psd, hdc->bkcolor); } if (cbCount == 0) { /* Special case - no text. Used to fill rectangle. */ return TRUE; } /* nyi: lpDx*/ /* draw text in current text foreground and background color*/ GdSetForegroundColor(hdc->psd, hdc->textcolor); //GdSetFont(hdc->font->pfont); /* this whole text alignment thing needs rewriting*/ if((hdc->textalign & TA_BASELINE) == TA_BASELINE) { /* this is not right... changed for kaffe port flags |= MWTF_TOP; */ flags |= MWTF_BASELINE; } else if(hdc->textalign & TA_BOTTOM) { MWCOORD ph, pw, pb; if(lprc) pt.y += lprc->bottom - lprc->top; else { GdGetTextSize(hdc->font->pfont, lpszString, cbCount, &pw, &ph, &pb, flags); pt.y += ph; } flags |= MWTF_BOTTOM; } else flags |= MWTF_TOP; if((hdc->textalign & TA_CENTER) == TA_CENTER) { MWCOORD ph, pw, pb; GdGetTextSize(hdc->font->pfont, lpszString, cbCount, &pw, &ph, &pb, flags); pt.x -= pw/2; } else if(hdc->textalign & TA_RIGHT) { MWCOORD ph, pw, pb; GdGetTextSize(hdc->font->pfont, lpszString, cbCount, &pw, &ph, &pb, flags); pt.x -= pw; } GdText(hdc->psd, hdc->font->pfont, pt.x, pt.y, lpszString, cbCount, flags); return TRUE; }
INT_PTR CALLBACK ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { RECT rc; int nXDifference; int nYDifference; LV_COLUMN column; WCHAR szTemp[256]; int cx, cy; switch (message) { case WM_INITDIALOG: /* Save the width and height */ GetClientRect(hDlg, &rc); nApplicationPageWidth = rc.right; nApplicationPageHeight = rc.bottom; /* Update window position */ SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); /* Get handles to the controls */ hApplicationPageListCtrl = GetDlgItem(hDlg, IDC_APPLIST); hApplicationPageEndTaskButton = GetDlgItem(hDlg, IDC_ENDTASK); hApplicationPageSwitchToButton = GetDlgItem(hDlg, IDC_SWITCHTO); hApplicationPageNewTaskButton = GetDlgItem(hDlg, IDC_NEWTASK); SetWindowTextW(hApplicationPageListCtrl, L"Tasks"); /* Initialize the application page's controls */ column.mask = LVCF_TEXT|LVCF_WIDTH; LoadStringW(hInst, IDS_TAB_TASK, szTemp, 256); column.pszText = szTemp; column.cx = 250; (void)ListView_InsertColumn(hApplicationPageListCtrl, 0, &column); /* Add the "Task" column */ column.mask = LVCF_TEXT|LVCF_WIDTH; LoadStringW(hInst, IDS_TAB_STATUS, szTemp, 256); column.pszText = szTemp; column.cx = 95; (void)ListView_InsertColumn(hApplicationPageListCtrl, 1, &column); /* Add the "Status" column */ (void)ListView_SetImageList(hApplicationPageListCtrl, ImageList_Create(16, 16, GetSystemColorDepth()|ILC_MASK, 0, 1), LVSIL_SMALL); (void)ListView_SetImageList(hApplicationPageListCtrl, ImageList_Create(32, 32, GetSystemColorDepth()|ILC_MASK, 0, 1), LVSIL_NORMAL); UpdateApplicationListControlViewSetting(); /* Start our refresh thread */ #ifdef RUN_APPS_PAGE hApplicationThread = CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, &dwApplicationThread); #endif /* Refresh page */ ApplicationPageUpdate(); return TRUE; case WM_DESTROY: /* Close refresh thread */ #ifdef RUN_APPS_PAGE EndLocalThread(&hApplicationThread, dwApplicationThread); #endif break; case WM_COMMAND: /* Handle the button clicks */ switch (LOWORD(wParam)) { case IDC_ENDTASK: ApplicationPage_OnEndTask(); break; case IDC_SWITCHTO: ApplicationPage_OnSwitchTo(); break; case IDC_NEWTASK: SendMessageW(hMainWnd, WM_COMMAND, MAKEWPARAM(ID_FILE_NEW, 0), 0); break; } break; case WM_SIZE: if (wParam == SIZE_MINIMIZED) return 0; cx = LOWORD(lParam); cy = HIWORD(lParam); nXDifference = cx - nApplicationPageWidth; nYDifference = cy - nApplicationPageHeight; nApplicationPageWidth = cx; nApplicationPageHeight = cy; /* Reposition the application page's controls */ GetWindowRect(hApplicationPageListCtrl, &rc); cx = (rc.right - rc.left) + nXDifference; cy = (rc.bottom - rc.top) + nYDifference; SetWindowPos(hApplicationPageListCtrl, NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOMOVE|SWP_NOZORDER); InvalidateRect(hApplicationPageListCtrl, NULL, TRUE); GetClientRect(hApplicationPageEndTaskButton, &rc); MapWindowPoints(hApplicationPageEndTaskButton, hDlg, (LPPOINT)(PRECT)(&rc), sizeof(RECT)/sizeof(POINT)); cx = rc.left + nXDifference; cy = rc.top + nYDifference; SetWindowPos(hApplicationPageEndTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); InvalidateRect(hApplicationPageEndTaskButton, NULL, TRUE); GetClientRect(hApplicationPageSwitchToButton, &rc); MapWindowPoints(hApplicationPageSwitchToButton, hDlg, (LPPOINT)(PRECT)(&rc), sizeof(RECT)/sizeof(POINT)); cx = rc.left + nXDifference; cy = rc.top + nYDifference; SetWindowPos(hApplicationPageSwitchToButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); InvalidateRect(hApplicationPageSwitchToButton, NULL, TRUE); GetClientRect(hApplicationPageNewTaskButton, &rc); MapWindowPoints(hApplicationPageNewTaskButton, hDlg, (LPPOINT)(PRECT)(&rc), sizeof(RECT)/sizeof(POINT)); cx = rc.left + nXDifference; cy = rc.top + nYDifference; SetWindowPos(hApplicationPageNewTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); InvalidateRect(hApplicationPageNewTaskButton, NULL, TRUE); break; case WM_NOTIFY: ApplicationPageOnNotify(wParam, lParam); break; case WM_KEYDOWN: if (wParam == VK_DELETE) ProcessPage_OnEndProcess(); break; } return 0; }
LRESULT CALLBACK WinXwindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: { LPCREATESTRUCT lpcs = (LPCREATESTRUCT) lParam; int xidno = (int) lpcs->lpCreateParams; Trace("WM_CREATE %d %d/%d %s:%d\n", xidno, lpcs->cx, lpcs->cy, xid[xidno].any.file, xid[xidno].any.line); WinXCreateBitmapForXid(hwnd, xidno, lpcs->cx, lpcs->cy); SetWindowWord(hwnd, 0, (WORD) xidno); return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_DESTROY: { XID xidno = (int) GetWindowWord(hwnd, 0); if (Widget_window(motd_viewer) == xidno) Motd_destroy(); if (Widget_window(keys_viewer) == xidno) Keys_destroy(); WinXDeleteDraw(xidno); return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_SIZE: { int xidno = (int) GetWindowWord(hwnd, 0); if (xidno > 0 && xidno < MAX_XIDS && xid[xidno].hwnd.hBmp) { int width = LOWORD(lParam); int height = HIWORD(lParam); Trace("WM_SIZE %d %d/%d %s:%d\n", xidno, width, height, xid[xidno].any.file, xid[xidno].any.line); WinXCreateBitmapForXid(hwnd, xidno, width, height); } return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_LBUTTONDOWN: { int xidno = (int) GetWindowWord(hwnd, 0); if (xid[xidno].hwnd.event_mask & ButtonPressMask) { XEvent event; XButtonEvent *button = (XButtonEvent *) & event; POINT pt; pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); MapWindowPoints(xid[xidno].hwnd.hWnd, xid[topWindow].hwnd.hWnd, &pt, 1); button->type = ButtonPress; button->window = xidno; button->x = LOWORD(lParam); button->y = HIWORD(lParam); button->x_root = pt.x; button->y_root = pt.y; button->button = Button1; win_xevent(event); } return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_LBUTTONUP: { int xidno = (int) GetWindowWord(hwnd, 0); if (xid[xidno].hwnd.event_mask & ButtonReleaseMask) { XEvent event; XButtonEvent *button = (XButtonEvent *) & event; Trace("ButtonUp in %d %s:%d\n", xidno, xid[xidno].any.file, xid[xidno].any.line); button->type = ButtonRelease; button->window = xidno; button->x = LOWORD(lParam); button->y = HIWORD(lParam); button->button = Button1; if (win_xevent(event) == -1) { WinXExit(); } return (0); } return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_MBUTTONDOWN: { int xidno = (int) GetWindowWord(hwnd, 0); if (xid[xidno].hwnd.event_mask & ButtonPressMask) { XEvent event; XButtonEvent *button = (XButtonEvent *) & event; POINT pt; pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); MapWindowPoints(xid[xidno].hwnd.hWnd, xid[topWindow].hwnd.hWnd, &pt, 1); button->type = ButtonPress; button->window = xidno; button->x = LOWORD(lParam); button->y = HIWORD(lParam); button->x_root = pt.x; button->y_root = pt.y; button->button = Button2; win_xevent(event); } return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_MBUTTONUP: { int xidno = (int) GetWindowWord(hwnd, 0); if (xid[xidno].hwnd.event_mask & ButtonReleaseMask) { XEvent event; XButtonEvent *button = (XButtonEvent *) & event; Trace("ButtonUp in %d %s:%d\n", xidno, xid[xidno].any.file, xid[xidno].any.line); button->type = ButtonRelease; button->window = xidno; button->x = LOWORD(lParam); button->y = HIWORD(lParam); button->button = Button2; if (win_xevent(event) == -1) { WinXExit(); } return (0); } return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_RBUTTONDOWN: { int xidno = (int) GetWindowWord(hwnd, 0); if (xid[xidno].hwnd.event_mask & ButtonPressMask) { XEvent event; XButtonEvent *button = (XButtonEvent *) & event; POINT pt; pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); MapWindowPoints(xid[xidno].hwnd.hWnd, xid[topWindow].hwnd.hWnd, &pt, 1); button->type = ButtonPress; button->window = xidno; button->x = LOWORD(lParam); button->y = HIWORD(lParam); button->x_root = pt.x; button->y_root = pt.y; button->button = Button3; win_xevent(event); } return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_RBUTTONUP: { int xidno = (int) GetWindowWord(hwnd, 0); if (xid[xidno].hwnd.event_mask & ButtonReleaseMask) { XEvent event; XButtonEvent *button = (XButtonEvent *) & event; Trace("ButtonUp in %d %s:%d\n", xidno, xid[xidno].any.file, xid[xidno].any.line); button->type = ButtonRelease; button->window = xidno; button->x = LOWORD(lParam); button->y = HIWORD(lParam); button->button = Button3; if (win_xevent(event) == -1) { WinXExit(); } return (0); } return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_MOUSEMOVE: { XID xidno = (int) GetWindowWord(hwnd, 0); XEvent event; XID i; XAnyEvent *enter = (XAnyEvent *) & event; /* Trace("MouseMove in %d %d/%d %s:%d\n", xidno, LOWORD(lParam), HIWORD(lParam), xid[xidno].any.file, xid[xidno].any.line); */ enter->type = LeaveNotify; for (i = 0; i < MAX_XIDS; i++) { if (i != xidno && xid[i].type == XIDTYPE_HWND && xid[i].hwnd.mouseover && xid[i].hwnd.event_mask & LeaveWindowMask) { Trace("LeaveNotify %d %s:%d\n", xidno, xid[xidno].any.file, xid[xidno].any.line); enter->window = i; win_xevent(event); xid[i].hwnd.mouseover = FALSE; } } if (xid[xidno].hwnd.event_mask & PointerMotionMask) { XMotionEvent *me = (XMotionEvent *) & event; me->type = MotionNotify; me->window = xidno; me->x = LOWORD(lParam); me->y = HIWORD(lParam); // if (me->x != draw_width/2 && me->y != draw_height/2) { win_xevent(event); // SetCursorPos(draw_width/2, draw_height/2); } // return(0); } else if (!xid[xidno].hwnd.mouseover) { /* PointerMotionMask is only on captured window *//* so don't do the mouseover event */ if (xid[xidno].hwnd.event_mask & EnterWindowMask) { Trace("EnterNotify %d %s:%d\n", xidno, xid[xidno].any.file, xid[xidno].any.line); enter->type = EnterNotify; enter->window = xidno; win_xevent(event); } xid[xidno].hwnd.mouseover = TRUE; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_ERASEBKGND: { RECT rect; if (GetClientRect(hwnd, &rect)) { HDC hBmpDC; XID xidno = (int) GetWindowWord(hwnd, 0); hBmpDC = xid[xidno].hwnd.hBmpDC; if (hBmpDC) { Trace("WM_ERASEBKGND %d color=%d %d/%d %d/%d\n", xidno, xid[xidno].hwnd.bgcolor, rect.left, rect.top, rect.right, rect.bottom); FillRect(hBmpDC, &rect, (HBRUSH) WinXGetBrush(xid[xidno].hwnd. bgcolor)); } } return (0); } case WM_PAINT: { RECT rect; if (GetUpdateRect(hwnd, &rect, FALSE)) { XID xidno = (int) GetWindowWord(hwnd, 0); // if (xidno == draw) // return DefWindowProc(hwnd, uMsg, wParam, lParam); if (xidno >= 0 && xidno < MAX_XIDS) { HDC hBmpDC; hBmpDC = xid[xidno].hwnd.hBmpDC; if (hBmpDC) { PAINTSTRUCT ps; HDC hDC; XEvent event; XExposeEvent *expose = (XExposeEvent *) & event; if (ThreadedDraw && xidno == (int) drawWindow) { ValidateRect(hwnd, &rect); winXTDraw(NULL, xidno, &rect); } else { hDC = BeginPaint(hwnd, &ps); if (xid[xidno].hwnd.event_mask & ExposureMask) { expose->type = Expose; expose->window = xidno; expose->x = rect.left; expose->y = rect.top; expose->width = rect.right - rect.left; expose->height = rect.bottom - rect.top; expose->count = 0; Trace("Expose %d %s:%d\n", xidno, xid[xidno].any.file, xid[xidno].any.line); win_xevent(event); } SelectPalette(hDC, myPal, FALSE); RealizePalette(hDC); if (xidno == (int) drawWindow) { // RECT r; // WinXUnscaled(hBmpDC); if (ThreadedDraw) { ValidateRect(hwnd, &rect); winXTDraw(hDC, xidno, &rect); } else { BitBlt(hDC, rect.left, rect.top, rect.right, rect.bottom, hBmpDC, rect.left, rect.top, SRCCOPY); } // GetClientRect(hwnd, &r); // WinXScaled(hBmpDC, r.right - r.left, r.bottom - r.top); drawPending = FALSE; } else { /* not the main playfield window */ BitBlt(hDC, rect.left, rect.top, rect.right, rect.bottom, hBmpDC, rect.left, rect.top, SRCCOPY); } EndPaint(hwnd, &ps); } return 0; } } } return DefWindowProc(hwnd, uMsg, wParam, lParam); } default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; }
BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_LBUTTONUP: { RECT rBtnMove; GetWindowRect(hBtnMove, &rBtnMove); INT xPos1 = GET_X_LPARAM(lParam); INT yPos1 = GET_Y_LPARAM(lParam); MoveWindow(hBtnMove, xPos1, yPos1, rBtnMove.right - rBtnMove.left, rBtnMove.bottom - rBtnMove.top, TRUE); } return TRUE; case WM_CLOSE: EndDialog(hWnd, 0); return TRUE; case WM_INITDIALOG: { hStatic = GetDlgItem(hWnd, IDC_BUTTON1); hBtnMove = GetDlgItem(hWnd, IDC_BUTTON2); hCoord = CreateWindow(TEXT("STATIC"), 0, WS_CHILD | WS_VISIBLE | SS_CENTER, 20, 40, 120, 20, hWnd, 0, hInst, 0); OriginalProc = (WNDPROC)SetWindowLong(hBtnMove, GWL_WNDPROC, LONG(MoveWindowProc)); } return TRUE; case WM_MOUSEMOVE: { RECT rtChild, rClientArea; INT mouseX = LOWORD(lParam); INT mouseY = HIWORD(lParam); GetWindowRect(hStatic, &rtChild); GetClientRect(hWnd, &rClientArea); MapWindowPoints(NULL, hWnd, (LPPOINT)&rtChild, 2); if (mouseX > rtChild.right) { if (mouseX - 10 <= rtChild.right) { if (mouseY >= rtChild.top && mouseY <= rtChild.bottom) { MyMoveFunc(rtChild, rClientArea, mouseX, mouseY); } } } else if (mouseX < rtChild.left) { if (mouseX + 10 >= rtChild.left) { if (mouseY >= rtChild.top && mouseY <= rtChild.bottom) { MyMoveFunc(rtChild, rClientArea, mouseX, mouseY); } } } if (mouseY > rtChild.bottom) { if (mouseY - 10 <= rtChild.bottom) { if (mouseX >= rtChild.left && mouseX <= rtChild.right) { MyMoveFunc(rtChild, rClientArea, mouseX, mouseY); } } } else if (mouseY < rtChild.top) { if (mouseY + 10 >= rtChild.top) { if (mouseX >= rtChild.left && mouseX <= rtChild.right) { MyMoveFunc(rtChild, rClientArea, mouseX, mouseY); } } } } return TRUE; } return FALSE; }
static LRESULT OnTocTreeNotify(WindowInfo *win, LPNMTREEVIEW pnmtv) { switch (pnmtv->hdr.code) { case TVN_SELCHANGED: // When the focus is set to the toc window the first item in the treeview is automatically // selected and a TVN_SELCHANGEDW notification message is sent with the special code pnmtv->action == 0x00001000. // We have to ignore this message to prevent the current page to be changed. if (TVC_BYKEYBOARD == pnmtv->action || TVC_BYMOUSE == pnmtv->action) GoToTocLinkForTVItem(win, pnmtv->hdr.hwndFrom, pnmtv->itemNew.hItem, TVC_BYMOUSE == pnmtv->action); // The case pnmtv->action==TVC_UNKNOWN is ignored because // it corresponds to a notification sent by // the function TreeView_DeleteAllItems after deletion of the item. break; case TVN_KEYDOWN: { TV_KEYDOWN *ptvkd = (TV_KEYDOWN *)pnmtv; if (VK_TAB == ptvkd->wVKey) { if (win->tabsVisible && IsCtrlPressed()) TabsOnCtrlTab(win, IsShiftPressed()); else AdvanceFocus(win); return 1; } break; } case NM_CLICK: { // Determine which item has been clicked (if any) TVHITTESTINFO ht = { 0 }; DWORD pos = GetMessagePos(); ht.pt.x = GET_X_LPARAM(pos); ht.pt.y = GET_Y_LPARAM(pos); MapWindowPoints(HWND_DESKTOP, pnmtv->hdr.hwndFrom, &ht.pt, 1); TreeView_HitTest(pnmtv->hdr.hwndFrom, &ht); // let TVN_SELCHANGED handle the click, if it isn't on the already selected item if ((ht.flags & TVHT_ONITEM) && TreeView_GetSelection(pnmtv->hdr.hwndFrom) == ht.hItem) GoToTocLinkForTVItem(win, pnmtv->hdr.hwndFrom, ht.hItem); break; } case NM_RETURN: GoToTocLinkForTVItem(win, pnmtv->hdr.hwndFrom); break; case NM_CUSTOMDRAW: #ifdef DISPLAY_TOC_PAGE_NUMBERS if (win->AsEbook()) return CDRF_DODEFAULT; switch (((LPNMCUSTOMDRAW)pnmtv)->dwDrawStage) { case CDDS_PREPAINT: return CDRF_NOTIFYITEMDRAW; case CDDS_ITEMPREPAINT: return CDRF_DODEFAULT | CDRF_NOTIFYPOSTPAINT; case CDDS_ITEMPOSTPAINT: RelayoutTocItem((LPNMTVCUSTOMDRAW)pnmtv); // fall through default: return CDRF_DODEFAULT; } break; #else return CDRF_DODEFAULT; #endif case TVN_GETINFOTIP: CustomizeTocInfoTip((LPNMTVGETINFOTIP)pnmtv); break; } return -1; }
LRESULT CALLBACK PhpGraphWndProc( __in HWND hwnd, __in UINT uMsg, __in WPARAM wParam, __in LPARAM lParam ) { PPHP_GRAPH_CONTEXT context; context = (PPHP_GRAPH_CONTEXT)GetWindowLongPtr(hwnd, 0); if (uMsg == WM_CREATE) { PhpCreateGraphContext(&context); SetWindowLongPtr(hwnd, 0, (LONG_PTR)context); } if (!context) return DefWindowProc(hwnd, uMsg, wParam, lParam); switch (uMsg) { case WM_CREATE: { context->Handle = hwnd; } break; case WM_DESTROY: { if (context->TooltipHandle) DestroyWindow(context->TooltipHandle); PhpDeleteBufferedContext(context); PhpFreeGraphContext(context); SetWindowLongPtr(hwnd, 0, (LONG_PTR)NULL); } break; case WM_SIZE: { // Force a re-create of the buffered context. PhpCreateBufferedContext(context); SendMessage(hwnd, GCM_DRAW, 0, 0); } break; case WM_PAINT: { PAINTSTRUCT paintStruct; RECT clientRect; HDC hdc; if (hdc = BeginPaint(hwnd, &paintStruct)) { GetClientRect(hwnd, &clientRect); if (context->BufferedContext) { BitBlt(hdc, 0, 0, clientRect.right, clientRect.bottom, context->BufferedContext, 0, 0, SRCCOPY); } EndPaint(hwnd, &paintStruct); } } break; case WM_ERASEBKGND: return 1; case WM_NOTIFY: { LPNMHDR header = (LPNMHDR)lParam; switch (header->code) { case TTN_GETDISPINFO: { LPNMTTDISPINFO dispInfo = (LPNMTTDISPINFO)header; POINT point; RECT clientRect; PH_GRAPH_GETTOOLTIPTEXT getTooltipText; GetCursorPos(&point); MapWindowPoints(NULL, hwnd, &point, 1); GetClientRect(hwnd, &clientRect); getTooltipText.Header.hwndFrom = hwnd; getTooltipText.Header.code = GCN_GETTOOLTIPTEXT; getTooltipText.Index = (clientRect.right - point.x) / context->DrawInfo.Step; getTooltipText.TotalCount = context->DrawInfo.LineDataCount; getTooltipText.Text.Buffer = NULL; getTooltipText.Text.Length = 0; SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)&getTooltipText); if (getTooltipText.Text.Buffer) { dispInfo->lpszText = getTooltipText.Text.Buffer; } } break; case TTN_SHOW: context->TooltipVisible = TRUE; break; case TTN_POP: context->TooltipVisible = FALSE; break; } } break; case WM_MOUSEMOVE: { if (context->TooltipHandle) { PhpUpdateTooltip(context); } } break; case WM_MOUSELEAVE: { if (context->TooltipHandle) { TOOLINFO toolInfo = { sizeof(toolInfo) }; toolInfo.hwnd = hwnd; toolInfo.uId = 1; SendMessage(context->TooltipHandle, TTM_TRACKACTIVATE, FALSE, (LPARAM)&toolInfo); } } break; case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_RBUTTONDBLCLK: { PH_GRAPH_MOUSEEVENT mouseEvent; RECT clientRect; GetClientRect(hwnd, &clientRect); mouseEvent.Header.hwndFrom = hwnd; mouseEvent.Header.code = GCN_MOUSEEVENT; mouseEvent.Message = uMsg; mouseEvent.Keys = (ULONG)wParam; mouseEvent.Point.x = LOWORD(lParam); mouseEvent.Point.y = HIWORD(lParam); mouseEvent.Index = (clientRect.right - mouseEvent.Point.x) / context->DrawInfo.Step; mouseEvent.TotalCount = context->DrawInfo.LineDataCount; SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)&mouseEvent); } break; case GCM_GETDRAWINFO: { PPH_GRAPH_DRAW_INFO drawInfo = (PPH_GRAPH_DRAW_INFO)lParam; memcpy(drawInfo, &context->DrawInfo, sizeof(PH_GRAPH_DRAW_INFO)); } return TRUE; case GCM_SETDRAWINFO: { PPH_GRAPH_DRAW_INFO drawInfo = (PPH_GRAPH_DRAW_INFO)lParam; ULONG width; ULONG height; width = context->DrawInfo.Width; height = context->DrawInfo.Height; memcpy(&context->DrawInfo, drawInfo, sizeof(PH_GRAPH_DRAW_INFO)); context->DrawInfo.Width = width; context->DrawInfo.Height = height; } return TRUE; case GCM_DRAW: { if (!context->BufferedContext) PhpCreateBufferedContext(context); context->DrawInfo.Width = context->BufferedContextRect.right; context->DrawInfo.Height = context->BufferedContextRect.bottom; { PH_GRAPH_GETDRAWINFO getDrawInfo; getDrawInfo.Header.hwndFrom = hwnd; getDrawInfo.Header.code = GCN_GETDRAWINFO; getDrawInfo.DrawInfo = &context->DrawInfo; SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)&getDrawInfo); } if (context->BufferedBits) PhDrawGraphDirect(context->BufferedContext, context->BufferedBits, &context->DrawInfo); } return TRUE; case GCM_MOVEGRID: { LONG increment = (LONG)wParam; context->DrawInfo.GridStart += increment; } return TRUE; case GCM_GETBUFFEREDCONTEXT: return (LRESULT)context->BufferedContext; case GCM_SETTOOLTIP: { if (wParam) { TOOLINFO toolInfo = { sizeof(toolInfo) }; context->TooltipHandle = CreateWindow( TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, PhLibImageBase, NULL ); context->TooltipOldWndProc = (WNDPROC)GetWindowLongPtr(context->TooltipHandle, GWLP_WNDPROC); SetProp(context->TooltipHandle, PhpMakeGraphTooltipContextAtom(), (HANDLE)context); SetWindowLongPtr(context->TooltipHandle, GWLP_WNDPROC, (LONG_PTR)PhpTooltipWndProc); SetWindowPos(context->TooltipHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); toolInfo.uFlags = TTF_ABSOLUTE | TTF_TRACK; toolInfo.hwnd = hwnd; toolInfo.uId = 1; toolInfo.lpszText = LPSTR_TEXTCALLBACK; SendMessage(context->TooltipHandle, TTM_ADDTOOL, 0, (LPARAM)&toolInfo); // Allow newlines (-1 doesn't work) // MAXINT doesn't work either on high DPI configurations for some reason. SendMessage(context->TooltipHandle, TTM_SETMAXTIPWIDTH, 0, 4096); } else { DestroyWindow(context->TooltipHandle); context->TooltipHandle = NULL; } } return TRUE; case GCM_UPDATETOOLTIP: { if (!context->TooltipHandle) return FALSE; if (context->TooltipVisible) { TOOLINFO toolInfo = { sizeof(toolInfo) }; toolInfo.hwnd = hwnd; toolInfo.uId = 1; toolInfo.lpszText = LPSTR_TEXTCALLBACK; SendMessage(context->TooltipHandle, TTM_UPDATETIPTEXT, 0, (LPARAM)&toolInfo); } else { PhpUpdateTooltip(context); } } return TRUE; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
LRESULT CConEmuChild::OnPaint() { if (!this) { _ASSERTE(this!=NULL); return 0; } LRESULT result = 0; BOOL lbSkipDraw = FALSE; //if (gbInPaint) // break; //_ASSERTE(FALSE); DEBUGSTRDRAW(L"CConEmuChild::OnPaint()\n"); //2009-09-28 может так (autotabs) if (mb_DisableRedraw) return 0; CVConGuard VCon(mp_VCon); mb_PostFullPaint = FALSE; if (gpSetCls->isAdvLogging>2) VCon->RCon()->LogString("CConEmuChild::OnPaint", TRUE); gpSetCls->Performance(tPerfBlt, FALSE); if (gpConEmu->isPictureView()) { // если PictureView распахнуто не на все окно - отрисовать видимую часть консоли! RECT rcPic, rcVRect, rcCommon; GetWindowRect(gpConEmu->hPictureView, &rcPic); GetWindowRect(mh_WndDC, &rcVRect); // Нам нужен ПОЛНЫЙ размер но ПОД тулбаром. //MapWindowPoints(mh_WndDC, NULL, (LPPOINT)&rcClient, 2); BOOL lbIntersect = IntersectRect(&rcCommon, &rcVRect, &rcPic); UNREFERENCED_PARAMETER(lbIntersect); // Убрать из отрисовки прямоугольник PictureView MapWindowPoints(NULL, mh_WndDC, (LPPOINT)&rcPic, 2); ValidateRect(mh_WndDC, &rcPic); MapWindowPoints(NULL, mh_WndDC, (LPPOINT)&rcVRect, 2); //Get ClientRect(gpConEmu->hPictureView, &rcPic); //Get ClientRect(mh_WndDC, &rcClient); // Если PicView занимает всю (почти? 95%) площадь окна //if (rcPic.right>=rcClient.right) if ((rcPic.right * rcPic.bottom) >= (rcVRect.right * rcVRect.bottom * 95 / 100)) { //_ASSERTE(FALSE); lbSkipDraw = TRUE; VCon->CheckTransparent(); // Типа "зальет цветом фона окна"? result = DefWindowProc(mh_WndDC, WM_PAINT, 0, 0); } } if (!lbSkipDraw) { if (mh_LastGuiChild) { if (!IsWindow(mh_LastGuiChild)) { mh_LastGuiChild = NULL; Invalidate(); } } else { mh_LastGuiChild = VCon->RCon() ? VCon->RCon()->GuiWnd() : NULL; } bool bRightClickingPaint = gpConEmu->isRightClickingPaint() && VCon->isActive(false); if (bRightClickingPaint) { // Скрыть окошко с "кружочком" gpConEmu->RightClickingPaint((HDC)INVALID_HANDLE_VALUE, VCon.VCon()); } PAINTSTRUCT ps; HDC hDc = BeginPaint(mh_WndDC, &ps); UNREFERENCED_PARAMETER(hDc); //RECT rcClient = VCon->GetDcClientRect(); VCon->PaintVCon(ps.hdc); if (bRightClickingPaint) { // Нарисует кружочек, или сбросит таймер, если кнопку отпустили gpConEmu->RightClickingPaint(VCon->GetIntDC()/*ps.hdc*/, VCon.VCon()); } EndPaint(mh_WndDC, &ps); } //Validate(); gpSetCls->Performance(tPerfBlt, TRUE); // Если открыто окно настроек - обновить системную информацию о размерах gpConEmu->UpdateSizes(); _ASSERTE(CVConGroup::isValid(VCon.VCon())); return result; }
// Message handler for "Change Monitor" box BOOL CALLBACK MonitorCbk(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { RECT windowSize; GetClientRect(hDlg, &windowSize); // Store button box's width and height unsigned int boxWidth = windowSize.right - windowSize.left - 18; unsigned int boxHeight = 89 - 9; // All buttons are scaled to fit within this window HWND buttonBox = CreateWindowEx(0, "STATIC", "", WS_VISIBLE | WS_CHILD, 9, 9, boxWidth, boxHeight, hDlg, reinterpret_cast<HMENU>(NULL), gInstance, nullptr); EnumDisplayMonitors(nullptr, // List all monitors nullptr, // Don't clip area MonitorEnumProc, reinterpret_cast<LPARAM>(&gMonitors) // User data ); /* Find coordinates of box that will fit all current desktop monitors * * Starts within 0 x 0 rectangle and expands it as necessary * * Then creates buttons within based upon that rectangle and matches * them with their corresponding monitor */ RECT desktopDims = {0, 0, 0, 0}; for (auto& monitor : gMonitors) { if (monitor.dim.left < desktopDims.left) { desktopDims.left = monitor.dim.left; } if (monitor.dim.right > desktopDims.right) { desktopDims.right = monitor.dim.right; } if (monitor.dim.top < desktopDims.top) { desktopDims.top = monitor.dim.top; } if (monitor.dim.bottom > desktopDims.bottom) { desktopDims.bottom = monitor.dim.bottom; } } // Store desktop width and height unsigned int desktopWidth = desktopDims.right - desktopDims.left; unsigned int desktopHeight = desktopDims.bottom - desktopDims.top; char buttonText[2]; bool isButtonClicked = false; // Create a button that will represent the monitor in this dialog for (auto& monitor : gMonitors) { isButtonClicked = gCurrentMonitor.dim.left == monitor.dim.left && gCurrentMonitor.dim.right == monitor.dim.right && gCurrentMonitor.dim.top == monitor.dim.top && gCurrentMonitor.dim.bottom == monitor.dim.bottom; if (isButtonClicked) { std::strcpy(buttonText, "*"); } else { std::strcpy(buttonText, " "); } monitor.activeButton = CreateWindowEx(0, "BUTTON", (buttonText + to_string(monitor.dim.right - monitor.dim.left) + " x " + to_string(monitor.dim.bottom - monitor.dim.top) + " ").c_str(), WS_VISIBLE | WS_CHILD, boxWidth * (monitor.dim.left - desktopDims.left) / desktopWidth, boxHeight * (monitor.dim.top - desktopDims.top) / desktopHeight, boxWidth * (monitor.dim.right - monitor.dim.left) / desktopWidth, boxHeight * (monitor.dim.bottom - monitor.dim.top) / desktopHeight, buttonBox, reinterpret_cast<HMENU>(NULL), gInstance, nullptr); if (isButtonClicked) { gCurrentMonitor = monitor; } } return TRUE; } case WM_PARENTNOTIFY: { if (LOWORD(wParam) == WM_LBUTTONDOWN) { /* This message is only received when a button other than OK was * pressed in the dialog window */ /* Convert cursor coordinates from dialog to desktop, * since the button's position is also in desktop coordinates */ POINT cursorPos = {LOWORD(lParam), HIWORD(lParam)}; MapWindowPoints(hDlg, nullptr, &cursorPos, 1); RECT buttonPos; // Change where test pattern will be drawn if button was clicked on for (auto& monitor : gMonitors) { GetWindowRect(monitor.activeButton, &buttonPos); // If cursor is within boundaries of button if (cursorPos.x > buttonPos.left && cursorPos.x < buttonPos.right && cursorPos.y > buttonPos.top && cursorPos.y < buttonPos.bottom) { // Remove asterisk from previous button's text SetWindowText(gCurrentMonitor.activeButton, (" " + to_string(gCurrentMonitor.dim.right - gCurrentMonitor.dim.left) + " x " + to_string(gCurrentMonitor.dim.bottom - gCurrentMonitor.dim.top) + " ").c_str()); // Set new selected button gCurrentMonitor = monitor; // Add asterisk to new button's text SetWindowText(gCurrentMonitor.activeButton, ("*" + to_string(gCurrentMonitor.dim.right - gCurrentMonitor.dim.left) + " x " + to_string(gCurrentMonitor.dim.bottom - gCurrentMonitor.dim.top) + " ").c_str()); } } } break; } case WM_COMMAND: { if (LOWORD(wParam) == IDOK) { for (auto& monitor : gMonitors) { DestroyWindow(monitor.activeButton); } gMonitors.clear(); gCurrentMonitor.activeButton = nullptr; // Give Kinect correct monitor dimensions so mouse is moved to proper position gProjectorKnt.setScreenRect(gCurrentMonitor.dim); EndDialog(hDlg, LOWORD(wParam)); } else if (LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg , LOWORD(wParam)); } break; } case WM_CLOSE: { EndDialog(hDlg, 0); break; } default: { return FALSE; } } return TRUE; }
LRESULT CConEmuChild::ChildWndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam) { LRESULT result = 0; // Logger MSG msgStr = {hWnd, messg, wParam, lParam}; ConEmuMsgLogger::Log(msgStr, ConEmuMsgLogger::msgCanvas); if (gpSetCls->isAdvLogging >= 4) { gpConEmu->LogMessage(hWnd, messg, wParam, lParam); } CVConGuard guard; CVirtualConsole* pVCon = NULL; if (messg == WM_CREATE || messg == WM_NCCREATE) { LPCREATESTRUCT lp = (LPCREATESTRUCT)lParam; guard = (CVirtualConsole*)lp->lpCreateParams; pVCon = guard.VCon(); if (pVCon) { gVConDcMap.Set(hWnd, pVCon); pVCon->m_TAutoCopy.Init(hWnd, TIMER_AUTOCOPY, TIMER_AUTOCOPY_DELAY); pVCon->m_TScrollShow.Init(hWnd, TIMER_SCROLL_SHOW, TIMER_SCROLL_SHOW_DELAY); pVCon->m_TScrollHide.Init(hWnd, TIMER_SCROLL_HIDE, TIMER_SCROLL_HIDE_DELAY); #ifndef SKIP_HIDE_TIMER pVCon->m_TScrollCheck.Init(hWnd, TIMER_SCROLL_CHECK, TIMER_SCROLL_CHECK_DELAY); #endif } } else if (hWnd != ghDcInDestroing) { if (!gVConDcMap.Get(hWnd, &pVCon) || !guard.Attach(pVCon)) pVCon = NULL; } if (messg == WM_SYSCHAR) { _ASSERTE(FALSE); // по идее, фокуса тут быть не должно // Чтобы не пищало result = TRUE; goto wrap; } if (!pVCon) { _ASSERTE(pVCon!=NULL || hWnd==ghDcInDestroing); result = DefWindowProc(hWnd, messg, wParam, lParam); goto wrap; } switch (messg) { case WM_SHOWWINDOW: { // Из-за многопоточности может случиться так, // что m_ChildGui.hGuiWnd инициализируется после // того, как был вызван ShowView, но до того // как было получено WM_SHOWWINDOW HWND hGui = pVCon->GuiWnd(); if (hGui) { //_ASSERTE(((wParam==0) || pVCon->RCon()->isGuiForceConView()) && "Show DC while GuiWnd exists"); if (wParam && !pVCon->RCon()->isGuiForceConView()) { wParam = SW_HIDE; } } result = DefWindowProc(hWnd, messg, wParam, lParam); break; } case WM_SETFOCUS: // Если в консоли работает "GUI" окно (GUI режим), то фокус нужно отдать туда. { // Фокус должен быть в главном окне! За исключением случая работы в GUI режиме. pVCon->setFocus(); } return 0; case WM_ERASEBKGND: result = 0; break; case WM_PAINT: result = pVCon->OnPaint(); break; case WM_PRINTCLIENT: if (wParam && (lParam & PRF_CLIENT)) { pVCon->PrintClient((HDC)wParam, false, NULL); } break; case WM_SIZE: #ifdef _DEBUG { RECT rc; GetClientRect(hWnd, &rc); short cx = LOWORD(lParam); rc.left = rc.left; } #endif result = pVCon->OnSize(wParam, lParam); break; case WM_MOVE: result = pVCon->OnMove(wParam, lParam); break; case WM_CREATE: break; case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: case WM_MOUSEMOVE: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_XBUTTONUP: case WM_XBUTTONDBLCLK: if (pVCon->RCon()->isGuiOverCon()) break; case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: case WM_ACTIVATE: case WM_ACTIVATEAPP: //case WM_MOUSEACTIVATE: case WM_KILLFOCUS: //case WM_SETFOCUS: case WM_VSCROLL: // Вся обработка в родителе { switch (messg) { case WM_VSCROLL: switch (LOWORD(wParam)) { case SB_THUMBTRACK: case SB_THUMBPOSITION: pVCon->mb_VTracking = TRUE; break; case SB_ENDSCROLL: pVCon->mb_VTracking = FALSE; break; } pVCon->RCon()->DoScroll(LOWORD(wParam), HIWORD(wParam)); break; case WM_LBUTTONUP: pVCon->mb_VTracking = FALSE; break; } TODO("Обработка ghWndWork"); HWND hParent = ghWnd; static bool bInFixStyle = false; if (!bInFixStyle) { hParent = GetParent(hWnd); if (hParent != ghWnd) { // Неправомерные действия плагинов фара? bInFixStyle = true; _ASSERTE(GetParent(hWnd)==ghWnd); SetParent(hWnd, ghWnd); bInFixStyle = false; hParent = ghWnd; } DWORD curStyle = GetWindowLong(hWnd, GWL_STYLE); if ((curStyle & CRITICAL_DCWND_STYLES) != (pVCon->mn_WndDCStyle & CRITICAL_DCWND_STYLES)) { // DC window styles was changed externally! bInFixStyle = true; _ASSERTEX(((curStyle & CRITICAL_DCWND_STYLES) != (pVCon->mn_WndDCStyle & CRITICAL_DCWND_STYLES))); SetWindowLongPtr(hWnd, GWL_STYLE, (LONG_PTR)(DWORD_PTR)pVCon->mn_WndDCStyle); bInFixStyle = false; } } if (messg >= WM_MOUSEFIRST && messg <= WM_MOUSELAST) { POINT pt = {LOWORD(lParam),HIWORD(lParam)}; MapWindowPoints(hWnd, hParent, &pt, 1); lParam = MAKELONG(pt.x,pt.y); } result = gpConEmu->WndProc(hParent, messg, wParam, lParam); } break; case WM_IME_NOTIFY: break; case WM_INPUTLANGCHANGE: case WM_INPUTLANGCHANGEREQUEST: { #ifdef _DEBUG if (IsDebuggerPresent()) { WCHAR szMsg[128]; _wsprintf(szMsg, SKIPLEN(countof(szMsg)) L"InChild %s(CP:%i, HKL:0x%08X)\n", (messg == WM_INPUTLANGCHANGE) ? L"WM_INPUTLANGCHANGE" : L"WM_INPUTLANGCHANGEREQUEST", (DWORD)wParam, (DWORD)lParam); DEBUGSTRLANG(szMsg); } #endif result = DefWindowProc(hWnd, messg, wParam, lParam); } break; #ifdef _DEBUG case WM_WINDOWPOSCHANGING: { WINDOWPOS* pwp = (WINDOWPOS*)lParam; result = DefWindowProc(hWnd, messg, wParam, lParam); } return result; case WM_WINDOWPOSCHANGED: { WINDOWPOS* pwp = (WINDOWPOS*)lParam; result = DefWindowProc(hWnd, messg, wParam, lParam); } break; #endif case WM_SETCURSOR: { gpConEmu->WndProc(hWnd, messg, wParam, lParam); //if (!result) // result = DefWindowProc(hWnd, messg, wParam, lParam); } // If an application processes this message, it should return TRUE to halt further processing or FALSE to continue. break; case WM_SYSCOMMAND: // -- лишние ограничения, похоже result = DefWindowProc(hWnd, messg, wParam, lParam); //if (wParam >= SC_SIZE && wParam <= SC_CONTEXTHELP/*0xF180*/) //{ // // Изменение размеров/максимизация/и т.п. окна консоли - запрещена // _ASSERTE(!(wParam >= SC_SIZE && wParam <= SC_CONTEXTHELP)); //} //else //{ // // По идее, сюда ничего приходить больше не должно // _ASSERTE(FALSE); //} break; case WM_TIMER: { switch(wParam) { #ifndef SKIP_HIDE_TIMER // Не будем прятать по таймеру - только по движению мышки case TIMER_SCROLL_CHECK: if (pVCon->mb_Scroll2Visible) { if (!pVCon->CheckMouseOverScroll()) { pVCon->HideScroll(FALSE/*abImmediate*/); } } break; #endif case TIMER_SCROLL_SHOW: if (pVCon->CheckMouseOverScroll() || pVCon->CheckScrollAutoPopup()) pVCon->ShowScroll(TRUE/*abImmediate*/); else pVCon->mb_Scroll2Visible = FALSE; if (pVCon->m_TScrollShow.IsStarted()) pVCon->m_TScrollShow.Stop(); break; case TIMER_SCROLL_HIDE: if (!pVCon->CheckMouseOverScroll()) pVCon->HideScroll(TRUE/*abImmediate*/); else pVCon->mb_Scroll2Visible = TRUE; if (pVCon->m_TScrollHide.IsStarted()) pVCon->m_TScrollHide.Stop(); break; case TIMER_AUTOCOPY: pVCon->SetAutoCopyTimer(false); if (!isPressed(VK_LBUTTON)) { pVCon->RCon()->AutoCopyTimer(); } break; } break; } // case WM_TIMER: case WM_GESTURENOTIFY: case WM_GESTURE: { gpConEmu->ProcessGestureMessage(hWnd, messg, wParam, lParam, result); break; } // case WM_GESTURE, WM_GESTURENOTIFY default: // Сообщение приходит из ConEmuPlugin if (messg == pVCon->mn_MsgTabChanged) { if (gpSet->isTabs) { //изменились табы, их нужно перечитать #ifdef MSGLOGGER WCHAR szDbg[128]; _wsprintf(szDbg, SKIPLEN(countof(szDbg)) L"Tabs:Notified(%i)\n", (DWORD)wParam); DEBUGSTRTABS(szDbg); #endif TODO("здесь хорошо бы вместо OnTimer реально обновить mn_TopProcessID") // иначе во время запуска PID фара еще может быть не известен... //gpConEmu->OnTimer(0,0); не получилось. индекс конмана не менялся, из-за этого индекс активного фара так и остался 0 WARNING("gpConEmu->mp_TabBar->Retrieve() ничего уже не делает вообще"); _ASSERTE(FALSE); gpConEmu->mp_TabBar->Retrieve(); } } else if (messg == pVCon->mn_MsgPostFullPaint) { pVCon->Redraw(); } else if (messg == pVCon->mn_MsgSavePaneSnapshoot) { pVCon->SavePaneSnapshoot(); } else if (messg == pVCon->mn_MsgDetachPosted) { pVCon->RCon()->Detach(true, (lParam == 1)); } else if (messg == gn_MsgVConTerminated) { CVirtualConsole* pVCon = (CVirtualConsole*)lParam; #ifdef _DEBUG _ASSERTE(pVCon == guard.VCon()); int i = -100; wchar_t szDbg[200]; wchar_t szTmp[128]; { lstrcpy(szDbg, L"gn_MsgVConTerminated"); i = CVConGroup::GetVConIndex(pVCon); if (i >= 1) { CTab tab(__FILE__,__LINE__); if (pVCon->RCon()->GetTab(0, tab)) lstrcpyn(szTmp, pVCon->RCon()->GetTabTitle(tab), countof(szTmp)); // чтобы не вылезло из szDbg else wcscpy_c(szTmp, L"<GetTab(0) failed>"); wsprintf(szDbg+_tcslen(szDbg), L": #%i: %s", i, szTmp); } lstrcat(szDbg, L"\n"); DEBUGSTRCONS(szDbg); } #endif // Do not "Guard" lParam here, validation will be made in ProcessVConClosed CConEmuChild::ProcessVConClosed(pVCon, TRUE); return 0; } #ifdef _DEBUG else if (messg == pVCon->mn_MsgCreateDbgDlg) { pVCon->CreateDbgDlg(); } #endif else if (messg) { result = DefWindowProc(hWnd, messg, wParam, lParam); } } wrap: return result; }
WINEXPORT BOOL CALLBACK WdeSplash( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { UINT msecs, timer, start; HDC dc, tdc; HBITMAP old; HWND w666; RECT rect, arect; PAINTSTRUCT ps; #ifdef __NT__ HINSTANCE hInstUser; PFNLI pfnLoadImage; #endif static BITMAP bm; static HBITMAP logo; static HBRUSH brush; static COLORREF color; switch( message ) { case WM_SYSCOLORCHANGE: WdeCtl3dColorChange(); break; case WM_DESTROY: if( logo ) { DeleteObject( logo ); } if( brush ) { DeleteObject( brush ); } break; case WM_INITDIALOG: msecs = *(UINT *)lParam; if( msecs ) { timer = SetTimer( hDlg, ABOUT_TIMER, msecs, NULL ); if( timer ) { SET_DLGDATA( hDlg, (LONG)timer ); } } #ifdef __NT__ hInstUser = GetModuleHandle( "USER32.DLL" ); pfnLoadImage = (PFNLI)GetProcAddress( hInstUser, "LoadImageA" ); if( pfnLoadImage != NULL ) { logo = pfnLoadImage( hInstWde, "AboutLogo", IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS ); } else { #endif logo = LoadBitmap( hInstWde, "AboutLogo" ); #ifdef __NT__ } #endif #if 0 color = GetSysColor( COLOR_BTNFACE ); color = RGB( 128, 128, 128 ); #endif color = GetSysColor( COLOR_BTNFACE ); brush = CreateSolidBrush( color ); GetObject( logo, sizeof( BITMAP ), &bm ); return( TRUE ); #if 0 #ifdef __NT__ case WM_CTLCOLORSTATIC: if( brush != NULL ) { dc = (HDC)wParam; SetBkColor( dc, color ); return( (LRESULT)brush ); } break; #else case WM_CTLCOLOR: if( brush != NULL ) { dc = (HDC)wParam; if( HIWORD( lParam ) == CTLCOLOR_STATIC ) { SetBkColor( dc, color ); } return( (LRESULT)brush ); } break; #endif case WM_ERASEBKGND: if( brush != NULL ) { GetClientRect( hDlg, &rect ); UnrealizeObject( brush ); FillRect( (HDC)wParam, &rect, brush ); return( TRUE ); } break; #endif case WM_PAINT: dc = BeginPaint( hDlg, &ps ); if( dc != NULL ) { w666 = GetDlgItem( hDlg, 666 ); GetClientRect( w666, &rect ); GetClientRect( hDlg, &arect ); start = (arect.right - arect.left - bm.bmWidth) / 2; MapWindowPoints( w666, hDlg, (POINT *)&rect, 2 ); tdc = CreateCompatibleDC( dc ); old = SelectObject( tdc, logo ); BitBlt( dc, start, rect.top + 20, bm.bmWidth, bm.bmHeight, tdc, 0, 0, SRCCOPY ); SelectObject( tdc, old ); DeleteDC( tdc ); EndPaint( hDlg, &ps ); } break; case WM_TIMER: timer = (UINT)GET_DLGDATA( hDlg ); if( timer ) { KillTimer( hDlg, timer ); } EndDialog( hDlg, TRUE ); return( TRUE ); } return( FALSE ); }
LRESULT CConEmuChild::BackWndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam) { LRESULT result = 0; // Logger MSG msgStr = {hWnd, messg, wParam, lParam}; ConEmuMsgLogger::Log(msgStr, ConEmuMsgLogger::msgBack); if (gpSetCls->isAdvLogging >= 4) { gpConEmu->LogMessage(hWnd, messg, wParam, lParam); } if (gpConEmu) gpConEmu->PreWndProc(messg); CVConGuard guard; CVirtualConsole* pVCon = NULL; if (messg == WM_CREATE || messg == WM_NCCREATE) { LPCREATESTRUCT lp = (LPCREATESTRUCT)lParam; guard = (CVirtualConsole*)lp->lpCreateParams; pVCon = guard.VCon(); if (pVCon) gVConBkMap.Set(hWnd, pVCon); } else if (hWnd != ghBkInDestroing) { if (!gVConBkMap.Get(hWnd, &pVCon) || !guard.Attach(pVCon)) pVCon = NULL; } if (messg == WM_SYSCHAR) { _ASSERTE(FALSE); // по идее, фокуса тут быть не должно // Чтобы не пищало result = TRUE; goto wrap; } if (!pVCon) { _ASSERTE(pVCon!=NULL || hWnd==ghBkInDestroing); result = DefWindowProc(hWnd, messg, wParam, lParam); goto wrap; } switch (messg) { case WM_SHOWWINDOW: if (wParam) { HWND hView = pVCon->GetView(); SetWindowPos(hView, HWND_TOP, 0, 0, 0,0, SWP_NOSIZE|SWP_NOMOVE); SetWindowPos(hWnd, hView, 0, 0, 0,0, SWP_NOSIZE|SWP_NOMOVE); } break; // DefaultProc case WM_SETFOCUS: // Если в консоли работает "GUI" окно (GUI режим), то фокус нужно отдать туда. { // Фокус должен быть в главном окне! За исключением случая работы в GUI режиме. pVCon->setFocus(); } return 0; case WM_ERASEBKGND: result = 0; break; case WM_PAINT: _ASSERTE(hWnd == pVCon->mh_WndBack); pVCon->OnPaintGaps(); break; case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: case WM_MOUSEMOVE: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_XBUTTONUP: case WM_XBUTTONDBLCLK: if (pVCon->RCon()->isGuiOverCon()) break; case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: case WM_ACTIVATE: case WM_ACTIVATEAPP: //case WM_MOUSEACTIVATE: case WM_KILLFOCUS: //case WM_SETFOCUS: case WM_VSCROLL: // Вся обработка в родителе { switch (messg) { case WM_VSCROLL: switch (LOWORD(wParam)) { case SB_THUMBTRACK: case SB_THUMBPOSITION: pVCon->mb_VTracking = TRUE; break; case SB_ENDSCROLL: pVCon->mb_VTracking = FALSE; break; } pVCon->RCon()->DoScroll(LOWORD(wParam), HIWORD(wParam)); break; case WM_LBUTTONUP: pVCon->mb_VTracking = FALSE; break; } TODO("Обработка ghWndWork"); HWND hParent = ghWnd; _ASSERTE(GetParent(hWnd)==ghWnd); if (messg >= WM_MOUSEFIRST && messg <= WM_MOUSELAST) { POINT pt = {LOWORD(lParam),HIWORD(lParam)}; MapWindowPoints(hWnd, hParent, &pt, 1); lParam = MAKELONG(pt.x,pt.y); } result = gpConEmu->WndProc(hParent, messg, wParam, lParam); } break; case WM_IME_NOTIFY: break; case WM_INPUTLANGCHANGE: case WM_INPUTLANGCHANGEREQUEST: { #ifdef _DEBUG if (IsDebuggerPresent()) { WCHAR szMsg[128]; _wsprintf(szMsg, SKIPLEN(countof(szMsg)) L"InChild %s(CP:%i, HKL:0x%08X)\n", (messg == WM_INPUTLANGCHANGE) ? L"WM_INPUTLANGCHANGE" : L"WM_INPUTLANGCHANGEREQUEST", (DWORD)wParam, (DWORD)lParam); DEBUGSTRLANG(szMsg); } #endif result = DefWindowProc(hWnd, messg, wParam, lParam); } break; #ifdef _DEBUG case WM_WINDOWPOSCHANGING: { WINDOWPOS* pwp = (WINDOWPOS*)lParam; result = DefWindowProc(hWnd, messg, wParam, lParam); } return result; case WM_WINDOWPOSCHANGED: { WINDOWPOS* pwp = (WINDOWPOS*)lParam; result = DefWindowProc(hWnd, messg, wParam, lParam); } break; #endif case WM_SETCURSOR: { gpConEmu->WndProc(hWnd, messg, wParam, lParam); //if (!result) // result = DefWindowProc(hWnd, messg, wParam, lParam); } // If an application processes this message, it should return TRUE to halt further processing or FALSE to continue. break; case WM_SYSCOMMAND: // -- лишние ограничения, похоже result = DefWindowProc(hWnd, messg, wParam, lParam); //if (wParam >= SC_SIZE && wParam <= SC_CONTEXTHELP/*0xF180*/) //{ // // Изменение размеров/максимизация/и т.п. окна консоли - запрещена // _ASSERTE(!(wParam >= SC_SIZE && wParam <= SC_CONTEXTHELP)); //} //else //{ // // По идее, сюда ничего приходить больше не должно // _ASSERTE(FALSE); //} break; case WM_GESTURENOTIFY: case WM_GESTURE: { gpConEmu->ProcessGestureMessage(hWnd, messg, wParam, lParam, result); break; } // case WM_GESTURE, WM_GESTURENOTIFY default: if (pVCon && (messg == pVCon->mn_MsgRestoreChildFocus)) { if (!gpConEmu->CanSetChildFocus()) { // Клик по иконке открывает системное меню //_ASSERTE(FALSE && "Must not get here?"); } else { CRealConsole* pRCon = pVCon->RCon(); if (pVCon->isActive(false)) { pRCon->GuiWndFocusRestore(); } if (pRCon->GuiWnd()) { pRCon->StoreGuiChildRect(NULL); } } } else { result = DefWindowProc(hWnd, messg, wParam, lParam); } } wrap: return result; }
static void choose_destination_file_and_convert(HWND hwnd, struct prg2wav_params *params) { char name[1024] = ""; OPENFILENAMEA ofn; BOOL success; int freq; struct tapdec_params tapdec_params; struct play_pause_stop play_pause_stop = { .pause = 0 }; HANDLE thread; DWORD thread_id; MSG msg; BOOL end_found = FALSE; uint8_t videotype; LRESULT selected_clock, selected_waveform; HBITMAP stop_icon; BOOL is_to_sound; name[0] = 0; freq = GetDlgItemInt(hwnd, IDC_FREQ, &success, FALSE); if (!success) freq = 44100; tapdec_params.volume = GetDlgItemInt(hwnd, IDC_VOL, &success, FALSE); if (!success) tapdec_params.volume = 254; if (tapdec_params.volume < 1) tapdec_params.volume = 1; tapdec_params.inverted = (IsDlgButtonChecked(hwnd, IDC_INVERTED) == BST_CHECKED); selected_clock = SendMessage(GetDlgItem(hwnd, IDC_MACHINE_TO), CB_GETCURSEL, 0, 0); switch(selected_clock){ default: params->machine = TAP_MACHINE_C64; videotype = TAP_VIDEOTYPE_PAL; break; case 1: params->machine = TAP_MACHINE_C64; videotype = TAP_VIDEOTYPE_NTSC; break; case 2: params->machine = TAP_MACHINE_VIC; videotype = TAP_VIDEOTYPE_PAL; break; case 3: params->machine = TAP_MACHINE_VIC; videotype = TAP_VIDEOTYPE_NTSC; break; case 4: params->machine = TAP_MACHINE_C16; videotype = TAP_VIDEOTYPE_PAL; break; case 5: params->machine = TAP_MACHINE_C16; videotype = TAP_VIDEOTYPE_NTSC; break; } selected_waveform = SendMessage(GetDlgItem(hwnd, IDC_WAVEFORM), CB_GETCURSEL, 0, 0); switch(selected_waveform){ default: tapdec_params.waveform = AUDIOTAP_WAVE_TRIANGLE; break; case 1: tapdec_params.waveform = AUDIOTAP_WAVE_SQUARE; break; case 2: tapdec_params.waveform = AUDIOTAP_WAVE_SINE; break; } if (IsDlgButtonChecked(hwnd, IDC_TO_WAV)) { if (audiotap_startup_status.audiofile_init_status != LIBRARY_OK) { MessageBoxA(hwnd, "Cannot save to WAV: audiofile.dll is missing, invalid or incorrectly installed", "WAV-PRG error", MB_ICONERROR); remove_all_simple_block_list_elements(¶ms->program); return; } memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.lpstrFilter = "WAV files\0*.wav\0All files\0*.*\0\0"; ofn.Flags = (OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT); ofn.lpstrFile = name; ofn.nMaxFile = sizeof(name); ofn.lpstrTitle = "Choose the WAV file to save to"; ofn.lpstrDefExt = "wav"; ofn.lpstrFile = name; ofn.nMaxFile = sizeof(name); if (!GetSaveFileNameA(&ofn)) { remove_all_simple_block_list_elements(¶ms->program); return; } if (tap2audio_open_to_wavfile4(&play_pause_stop.file, name, &tapdec_params, freq, params->machine, videotype) != AUDIOTAP_OK) { MessageBoxA(hwnd, "Error opening file", "WAV-PRG error", MB_ICONERROR); remove_all_simple_block_list_elements(¶ms->program); return; } } else if (IsDlgButtonChecked(hwnd, IDC_TO_SOUND)) { if (audiotap_startup_status.portaudio_init_status != LIBRARY_OK) { MessageBoxA(hwnd, "Cannot play to sound card: libportaudio.dll is missing, invalid or incorrectly installed", "WAV-PRG error", MB_ICONERROR); remove_all_simple_block_list_elements(¶ms->program); return; } if (tap2audio_open_to_soundcard4(&play_pause_stop.file, &tapdec_params, freq, params->machine, videotype) != AUDIOTAP_OK) { MessageBoxA(hwnd, "Error opening sound card", "WAV-PRG error", MB_ICONERROR); remove_all_simple_block_list_elements(¶ms->program); return; } } else { uint8_t version; memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.lpstrFilter = "TAP files\0*.tap\0All files\0*.*\0\0"; ofn.Flags = (OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK); ofn.lpstrFile = name; ofn.nMaxFile = sizeof(name); ofn.lpstrTitle = "Choose the TAP file to save to"; ofn.lpstrDefExt = "tap"; ofn.lpfnHook = tap_save_hook_proc; ofn.lpstrFile = name; ofn.nMaxFile = sizeof(name); ofn.hInstance = instance; ofn.lpTemplateName = MAKEINTRESOURCEA(IDD_CHOOSE_TAP_VERSION); ofn.lCustData = (LPARAM)&version; if (!GetSaveFileNameA(&ofn)) { remove_all_simple_block_list_elements(¶ms->program); return; } if (tap2audio_open_to_tapfile3(&play_pause_stop.file, name, version, params->machine, videotype) != AUDIOTAP_OK) { MessageBoxA(hwnd, "Error opening TAP file", "WAV-PRG error", MB_ICONERROR); remove_all_simple_block_list_elements(¶ms->program); return; } } params->file = play_pause_stop.file; params->status_window = CreateDialog(instance, MAKEINTRESOURCE(IDD_PRG2WAV_STATUS), hwnd, prg2wav_status_window_proc); EnableWindow(hwnd, FALSE); ShowWindow(params->status_window, SW_SHOWNORMAL); UpdateWindow(params->status_window); SetWindowLong(params->status_window, GWL_USERDATA, (LONG)&play_pause_stop); thread = CreateThread(NULL, 0, prg2wav_thread, params, 0, &thread_id); is_to_sound = IsDlgButtonChecked(hwnd, IDC_TO_SOUND); if (is_to_sound) { HWND stop_button = GetDlgItem(params->status_window, IDCANCEL); RECT window_rect, play_pause_button_rect; stop_icon = LoadBitmap(instance, MAKEINTRESOURCE(IDB_STOP)); play_pause_stop.play_icon = LoadBitmap(instance, MAKEINTRESOURCE(IDB_PLAY)); play_pause_stop.pause_icon = LoadBitmap(instance, MAKEINTRESOURCE(IDB_PAUSE)); /* make sure the pause button is visible and shows the pause icon*/ SendDlgItemMessage(params->status_window, IDC_PLAYPAUSE, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)play_pause_stop.pause_icon); ShowWindow(GetDlgItem(params->status_window, IDC_PLAYPAUSE), SW_SHOW); /* get width of window */ GetClientRect(params->status_window, &window_rect); /* get absolute position of play-pause button */ GetWindowRect(GetDlgItem(params->status_window, IDC_PLAYPAUSE), &play_pause_button_rect); /* get position of play-pause button within window */ MapWindowPoints(NULL, params->status_window, (LPPOINT)&play_pause_button_rect, 2); /* make stop button as big as play-pause button, top-aligned and symmetrically placed */ MoveWindow(stop_button, window_rect.right - play_pause_button_rect.right, play_pause_button_rect.top, play_pause_button_rect.right - play_pause_button_rect.left, play_pause_button_rect.bottom - play_pause_button_rect.top, TRUE); /* make sure the stop button shows the stop icon instead of the word Cancel*/ SetWindowLongPtr(stop_button, GWL_STYLE, GetWindowLongPtr(stop_button, GWL_STYLE) | BS_BITMAP); SendDlgItemMessage(params->status_window, IDCANCEL, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)stop_icon); } while (1) { DWORD retval; retval = MsgWaitForMultipleObjects(1, &thread, FALSE, INFINITE, QS_ALLINPUT); if (retval == WAIT_OBJECT_0) break; while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { if (is_to_sound && msg.message == WM_KEYDOWN) { if (msg.wParam == VK_MEDIA_PLAY_PAUSE) PostMessage (params->status_window, WM_COMMAND, IDC_PLAYPAUSE, 0); else if (msg.wParam == VK_MEDIA_STOP) PostMessage (params->status_window, WM_COMMAND, IDCANCEL, 0); } TranslateMessage(&msg); DispatchMessage(&msg); } } EnableWindow(hwnd, TRUE); DestroyWindow(params->status_window); tap2audio_close(params->file); remove_all_simple_block_list_elements(¶ms->program); if (IsDlgButtonChecked(hwnd, IDC_TO_SOUND)) { DeleteObject(play_pause_stop.play_icon); DeleteObject(play_pause_stop.pause_icon); DeleteObject(stop_icon); } } static void choose_file(HWND hwnd){ char name[1024] = ""; OPENFILENAMEA ofn; struct prg2wav_params params; params.program = NULL; memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.hInstance = instance; ofn.lpstrFilter = "All supported types\0*.t64;*.prg;*.p00\0Tape image files (*.t64)\0*.t64\0Program files (*.prg)\0*.prg\0PC64 files (*.p00)\0*.p00\0All files\0*.*\0\0"; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; ofn.lpstrFile = name; ofn.nMaxFile = sizeof(name); ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = "Choose the PRG, P00 or T64 file"; ofn.Flags = (OFN_EXPLORER | OFN_HIDEREADONLY | OFN_NOTESTFILECREATE | OFN_FILEMUSTEXIST | OFN_ENABLEHOOK | OFN_ENABLETEMPLATE | OFN_SHAREAWARE); ofn.lpfnHook = frompc_hook_proc; ofn.lpTemplateName = MAKEINTRESOURCEA(IDD_CONTENTS); ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = NULL; ofn.lCustData = (LPARAM)¶ms.program; if (GetOpenFileNameA(&ofn)) choose_destination_file_and_convert(hwnd, ¶ms); }
/*********************************************************************** * UPDOWN_SetBuddy * * Sets bud as a new Buddy. * Then, it should subclass the buddy * If window has the UDS_ARROWKEYS, it subclasses the buddy window to * process the UP/DOWN arrow keys. * If window has the UDS_ALIGNLEFT or UDS_ALIGNRIGHT style * the size/pos of the buddy and the control are adjusted accordingly. */ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud) { RECT budRect; /* new coord for the buddy */ int x, width; /* new x position and width for the up-down */ WCHAR buddyClass[40]; HWND ret; TRACE("(hwnd=%p, bud=%p)\n", infoPtr->Self, bud); ret = infoPtr->Buddy; /* there is already a buddy assigned */ if (infoPtr->Buddy) RemoveWindowSubclass(infoPtr->Buddy, UPDOWN_Buddy_SubclassProc, BUDDY_SUBCLASSID); if (!IsWindow(bud)) bud = NULL; /* Store buddy window handle */ infoPtr->Buddy = bud; if(bud) { /* Store buddy window class type */ infoPtr->BuddyType = BUDDY_TYPE_UNKNOWN; if (GetClassNameW(bud, buddyClass, COUNT_OF(buddyClass))) { if (lstrcmpiW(buddyClass, WC_EDITW) == 0) infoPtr->BuddyType = BUDDY_TYPE_EDIT; else if (lstrcmpiW(buddyClass, WC_LISTBOXW) == 0) infoPtr->BuddyType = BUDDY_TYPE_LISTBOX; } if (infoPtr->dwStyle & UDS_ARROWKEYS) SetWindowSubclass(bud, UPDOWN_Buddy_SubclassProc, BUDDY_SUBCLASSID, (DWORD_PTR)infoPtr->Self); /* Get the rect of the buddy relative to its parent */ GetWindowRect(infoPtr->Buddy, &budRect); MapWindowPoints(HWND_DESKTOP, GetParent(infoPtr->Buddy), (POINT *)(&budRect.left), 2); /* now do the positioning */ if (infoPtr->dwStyle & UDS_ALIGNLEFT) { x = budRect.left; budRect.left += DEFAULT_WIDTH + DEFAULT_XSEP; } else if (infoPtr->dwStyle & UDS_ALIGNRIGHT) { budRect.right -= DEFAULT_WIDTH + DEFAULT_XSEP; x = budRect.right+DEFAULT_XSEP; } else { /* nothing to do */ return ret; } /* first adjust the buddy to accommodate the up/down */ SetWindowPos(infoPtr->Buddy, 0, budRect.left, budRect.top, budRect.right - budRect.left, budRect.bottom - budRect.top, SWP_NOACTIVATE|SWP_NOZORDER); /* now position the up/down */ /* Since the UDS_ALIGN* flags were used, */ /* we will pick the position and size of the window. */ width = DEFAULT_WIDTH; /* * If the updown has a buddy border, it has to overlap with the buddy * to look as if it is integrated with the buddy control. * We nudge the control or change its size to overlap. */ if (UPDOWN_HasBuddyBorder(infoPtr)) { if(infoPtr->dwStyle & UDS_ALIGNLEFT) width += DEFAULT_BUDDYBORDER; else x -= DEFAULT_BUDDYBORDER; } SetWindowPos(infoPtr->Self, 0, x, budRect.top - DEFAULT_ADDTOP, width, budRect.bottom - budRect.top + DEFAULT_ADDTOP + DEFAULT_ADDBOT, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER); } else { RECT rect; GetWindowRect(infoPtr->Self, &rect); MapWindowPoints(HWND_DESKTOP, GetParent(infoPtr->Self), (POINT *)&rect, 2); SetWindowPos(infoPtr->Self, 0, rect.left, rect.top, DEFAULT_WIDTH, rect.bottom - rect.top, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER); } return ret; }