static void AeroPaintControl(HWND hwnd, HDC hdc, WNDPROC OldWndProc, UINT msg = WM_PRINT, LPARAM lpFlags = PRF_CLIENT | PRF_NONCLIENT) { HBITMAP hBmp, hOldBmp; RECT rc; GetClientRect(hwnd, &rc); BYTE *pBits; HDC tempDC = CreateCompatibleDC(hdc); BITMAPINFO bmi; bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = rc.right; bmi.bmiHeader.biHeight = -rc.bottom; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; hBmp = CreateDIBSection(tempDC, &bmi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0); hOldBmp = (HBITMAP)SelectObject(tempDC, hBmp); //paint SetPropA(hwnd, "Miranda.AeroRender.Active", (HANDLE)TRUE); mir_callNextSubclass(hwnd, OldWndProc, msg, (WPARAM)tempDC, lpFlags); SetPropA(hwnd, "Miranda.AeroRender.Active", (HANDLE)FALSE); // Fix alpha channel GdiFlush(); for (int i = 0; i < rc.right*rc.bottom; i++, pBits += 4) if (!pBits[3]) pBits[3] = 255; //Copy to output BitBlt(hdc, 0, 0, rc.right, rc.bottom, tempDC, 0, 0, SRCCOPY); SelectObject(tempDC, hOldBmp); DeleteObject(hBmp); DeleteDC(tempDC); }
bool ContainerNode::Create(HWND hParent, HINSTANCE hInstance, int x, int y, int w, int h) { ATOM nClass=RegisterClass(hInstance); if (!nClass) { MessageBoxA(NULL,"Could not register class!","Error",MB_OK|MB_ICONEXCLAMATION); return 0; } DWORD dwStyle=WS_CHILD|WS_VISIBLE; DWORD dwExStyle=0; m_hWnd=CreateWindowExA(dwExStyle,(LPCSTR)nClass,m_szTitle.c_str(),dwStyle,x,y,w,h,hParent,0,hInstance,0); if (m_hWnd) { m_hTooltipWnd=CreateWindowExA(WS_EX_TOPMOST,TOOLTIPS_CLASSA,"",WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,m_hWnd,0,hInstance,0); SetPropA(m_hWnd,"ContainerNode",(HANDLE)this); HWND hLabel=CreateWindowExA(0,"STATIC",m_szTitle.c_str(),WS_CHILD|WS_VISIBLE,0,0,w,m_nLineHeight,m_hWnd,0,hInstance,0); if (hLabel) SendMessage(hLabel,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); CreateChildNodes(m_hWnd,hInstance,m_nMargin,m_nMargin+m_nLineHeight); return true; } return false; }
HWND ContainerNode::CreateAsWindow(HINSTANCE hInstance) { ATOM nClass=RegisterClass(hInstance); if (!nClass) { MessageBoxA(NULL,"Could not register class!","Error",MB_OK|MB_ICONEXCLAMATION); return 0; } RECT rcClient={0,0,GetWidth(),GetHeight()}; DWORD dwStyle=WS_TILED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU; DWORD dwExStyle=0; AdjustWindowRectEx(&rcClient,dwStyle,false,dwExStyle); int nWidth=rcClient.right-rcClient.left; int nHeight=rcClient.bottom-rcClient.top; m_hWnd=CreateWindowExA(dwExStyle,(LPCSTR)nClass,m_szTitle.c_str(),dwStyle,CW_USEDEFAULT,CW_USEDEFAULT,nWidth,nHeight,0,0,hInstance,0); if (m_hWnd) { m_hTooltipWnd=CreateWindowExA(WS_EX_TOPMOST,TOOLTIPS_CLASSA,"",WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,m_hWnd,0,hInstance,0); SetPropA(m_hWnd,"ContainerNode",(HANDLE)this); CreateChildNodes(m_hWnd,hInstance,m_nMargin,m_nMargin); } return m_hWnd; }
void ContainerNode::AddTooltip(HWND hChild, HINSTANCE hInstance, std::string szTip) { if (!m_hTooltipWnd) return; TOOLINFOA ti; ZeroMemory(&ti,sizeof(TOOLINFOA)); ti.cbSize=sizeof(TOOLINFOA); ti.uFlags=TTF_SUBCLASS; ti.hinst=hInstance; ti.uId=GetNextFreeCommand(); ti.lpszText=(LPSTR)szTip.c_str(); char szClassName[64]; if (!GetClassNameA(hChild,szClassName,64)) strcpy(szClassName,""); if (strcmpi(szClassName,"STATIC")==0 && GetPropA(hChild,"OriginalStaticProc")==0) { SetPropA(hChild,"OriginalStaticProc",(HANDLE)SetWindowLong(hChild,GWL_WNDPROC,(LONG)StaticHookProc)); } ti.hwnd=hChild; RECT rcClient; GetClientRect(hChild,&rcClient); CopyRect(&ti.rect,&rcClient); SendMessage(m_hTooltipWnd,TTM_ADDTOOLA,0,(WPARAM)&ti); }
static __forceinline void sttTreeList_SeWindowData(HWND hwnd, HANDLE data) { SetPropA(hwnd, "Miranda.TreeList", (HANDLE)data); }
LONG FD31_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) { int i, n; WCHAR tmpstr[BUFFILE]; LPWSTR pstr, old_pstr; LPOPENFILENAMEW ofn; PFD31_DATA lfs = (PFD31_DATA) lParam; if (!lfs) return FALSE; SetPropA(hWnd, FD31_OFN_PROP, (HANDLE)lfs); lfs->hwnd = hWnd; ofn = lfs->ofnW; TRACE("flags=%lx initialdir=%s\n", ofn->Flags, debugstr_w(ofn->lpstrInitialDir)); SetWindowTextW( hWnd, ofn->lpstrTitle ); /* read custom filter information */ if (ofn->lpstrCustomFilter) { pstr = ofn->lpstrCustomFilter; n = 0; TRACE("lpstrCustomFilter = %p\n", pstr); while(*pstr) { old_pstr = pstr; i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0, (LPARAM)(ofn->lpstrCustomFilter) + n ); n += lstrlenW(pstr) + 1; pstr += lstrlenW(pstr) + 1; TRACE("add str=%s associated to %s\n", debugstr_w(old_pstr), debugstr_w(pstr)); SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); n += lstrlenW(pstr) + 1; pstr += lstrlenW(pstr) + 1; } } /* read filter information */ if (ofn->lpstrFilter) { pstr = (LPWSTR) ofn->lpstrFilter; n = 0; while(*pstr) { old_pstr = pstr; i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0, (LPARAM)(ofn->lpstrFilter + n) ); n += lstrlenW(pstr) + 1; pstr += lstrlenW(pstr) + 1; TRACE("add str=%s associated to %s\n", debugstr_w(old_pstr), debugstr_w(pstr)); SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr); n += lstrlenW(pstr) + 1; pstr += lstrlenW(pstr) + 1; } } /* set default filter */ if (ofn->nFilterIndex == 0 && ofn->lpstrCustomFilter == NULL) ofn->nFilterIndex = 1; SendDlgItemMessageW(hWnd, cmb1, CB_SETCURSEL, ofn->nFilterIndex - 1, 0); lstrcpynW(tmpstr, FD31_GetFileType(ofn->lpstrCustomFilter, (LPWSTR)ofn->lpstrFilter, ofn->nFilterIndex - 1),BUFFILE); TRACE("nFilterIndex = %ld, SetText of edt1 to %s\n", ofn->nFilterIndex, debugstr_w(tmpstr)); SetDlgItemTextW( hWnd, edt1, tmpstr ); /* get drive list */ *tmpstr = 0; DlgDirListComboBoxW(hWnd, tmpstr, cmb2, 0, DDL_DRIVES | DDL_EXCLUSIVE); /* read initial directory */ /* FIXME: Note that this is now very version-specific (See MSDN description of * the OPENFILENAME structure). For example under 2000/XP any path in the * lpstrFile overrides the lpstrInitialDir, but not under 95/98/ME */ if (ofn->lpstrInitialDir != NULL) { int len; lstrcpynW(tmpstr, ofn->lpstrInitialDir, 511); len = lstrlenW(tmpstr); if (len > 0 && tmpstr[len-1] != '\\' && tmpstr[len-1] != ':') { tmpstr[len]='\\'; tmpstr[len+1]='\0'; } } else *tmpstr = 0; if (!FD31_ScanDir(hWnd, tmpstr)) { *tmpstr = 0; if (!FD31_ScanDir(hWnd, tmpstr)) WARN("Couldn't read initial directory %s!\n", debugstr_w(tmpstr)); } /* select current drive in combo 2, omit missing drives */ { char dir[MAX_PATH]; char str[4] = "a:\\"; GetCurrentDirectoryA( sizeof(dir), dir ); for(i = 0, n = -1; i < 26; i++) { str[0] = 'a' + i; if (GetDriveTypeA(str) > DRIVE_NO_ROOT_DIR) n++; if (toupper(str[0]) == toupper(dir[0])) break; } } SendDlgItemMessageW(hWnd, cmb2, CB_SETCURSEL, n, 0); if (!(ofn->Flags & OFN_SHOWHELP)) ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE); if (ofn->Flags & OFN_HIDEREADONLY) ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE); if (lfs->hook) return (BOOL) FD31_CallWindowProc(lfs, WM_INITDIALOG, wParam, lfs->lParam); return TRUE; }
/*********************************************************************** * COMDLG32_FindReplaceDlgProc [internal] * [Find/Replace]Text32[A/W] window procedure. */ static INT_PTR CALLBACK COMDLG32_FindReplaceDlgProc(HWND hDlgWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { COMDLG32_FR_Data *pdata = (COMDLG32_FR_Data *)GetPropA(hDlgWnd, (LPSTR)COMDLG32_Atom); INT_PTR retval = TRUE; if(iMsg == WM_INITDIALOG) { pdata = (COMDLG32_FR_Data *)lParam; if(!SetPropA(hDlgWnd, (LPSTR)COMDLG32_Atom, (HANDLE)pdata)) { ERR("Could not Set prop; invent a gracefull exit?...\n"); DestroyWindow(hDlgWnd); return FALSE; } SendDlgItemMessageA(hDlgWnd, edt1, EM_SETLIMITTEXT, (WPARAM)pdata->fr.wFindWhatLen, 0); SendDlgItemMessageA(hDlgWnd, edt1, WM_SETTEXT, 0, (LPARAM)pdata->fr.lpstrFindWhat); if(pdata->fr.Flags & FR_WINE_REPLACE) { SendDlgItemMessageA(hDlgWnd, edt2, EM_SETLIMITTEXT, (WPARAM)pdata->fr.wReplaceWithLen, 0); SendDlgItemMessageA(hDlgWnd, edt2, WM_SETTEXT, 0, (LPARAM)pdata->fr.lpstrReplaceWith); } if(!(pdata->fr.Flags & FR_SHOWHELP)) ShowWindow(GetDlgItem(hDlgWnd, pshHelp), SW_HIDE); if(pdata->fr.Flags & FR_HIDEUPDOWN) { ShowWindow(GetDlgItem(hDlgWnd, rad1), SW_HIDE); ShowWindow(GetDlgItem(hDlgWnd, rad2), SW_HIDE); ShowWindow(GetDlgItem(hDlgWnd, grp1), SW_HIDE); } else if(pdata->fr.Flags & FR_NOUPDOWN) { EnableWindow(GetDlgItem(hDlgWnd, rad1), FALSE); EnableWindow(GetDlgItem(hDlgWnd, rad2), FALSE); EnableWindow(GetDlgItem(hDlgWnd, grp1), FALSE); } else { SendDlgItemMessageA(hDlgWnd, rad1, BM_SETCHECK, pdata->fr.Flags & FR_DOWN ? 0 : BST_CHECKED, 0); SendDlgItemMessageA(hDlgWnd, rad2, BM_SETCHECK, pdata->fr.Flags & FR_DOWN ? BST_CHECKED : 0, 0); } if(pdata->fr.Flags & FR_HIDEMATCHCASE) ShowWindow(GetDlgItem(hDlgWnd, chx2), SW_HIDE); else if(pdata->fr.Flags & FR_NOMATCHCASE) EnableWindow(GetDlgItem(hDlgWnd, chx2), FALSE); else SendDlgItemMessageA(hDlgWnd, chx2, BM_SETCHECK, pdata->fr.Flags & FR_MATCHCASE ? BST_CHECKED : 0, 0); if(pdata->fr.Flags & FR_HIDEWHOLEWORD) ShowWindow(GetDlgItem(hDlgWnd, chx1), SW_HIDE); else if(pdata->fr.Flags & FR_NOWHOLEWORD) EnableWindow(GetDlgItem(hDlgWnd, chx1), FALSE); else SendDlgItemMessageA(hDlgWnd, chx1, BM_SETCHECK, pdata->fr.Flags & FR_WHOLEWORD ? BST_CHECKED : 0, 0); /* We did the init here, now call the hook if requested */ /* We do not do ShowWindow if hook exists and is FALSE */ /* per MSDN Article Q96135 */ if((pdata->fr.Flags & FR_ENABLEHOOK) && ! pdata->fr.lpfnHook(hDlgWnd, iMsg, wParam, (LPARAM) &pdata->fr)) return TRUE; ShowWindow(hDlgWnd, SW_SHOWNORMAL); UpdateWindow(hDlgWnd); return TRUE; } if(pdata && (pdata->fr.Flags & FR_ENABLEHOOK)) { retval = pdata->fr.lpfnHook(hDlgWnd, iMsg, wParam, lParam); } else retval = FALSE; if(pdata && !retval) { retval = TRUE; switch(iMsg) { case WM_COMMAND: COMDLG32_FR_HandleWMCommand(hDlgWnd, pdata, LOWORD(wParam), HIWORD(wParam)); break; case WM_CLOSE: COMDLG32_FR_HandleWMCommand(hDlgWnd, pdata, IDCANCEL, BN_CLICKED); break; case WM_HELP: /* Heeeeelp! */ FIXME("Got WM_HELP. Who is gonna supply it?\n"); break; case WM_CONTEXTMENU: /* Heeeeelp! */ FIXME("Got WM_CONTEXTMENU. Who is gonna supply it?\n"); break; /* FIXME: Handle F1 help */ default: retval = FALSE; /* We did not handle the message */ } } /* WM_DESTROY is a special case. * We need to ensure that the allocated memory is freed just before * the dialog is killed. We also need to remove the added prop. */ if(iMsg == WM_DESTROY) { RemovePropA(hDlgWnd, (LPSTR)COMDLG32_Atom); HeapFree(GetProcessHeap(), 0, pdata); } return retval; }
/* MAKE_EXPORT SetPropW_new=SetPropW */ BOOL WINAPI SetPropW_new(HWND hWnd, LPCWSTR lpStringW, HANDLE hData) { ALLOC_WtoA(lpString); return SetPropA(hWnd, lpStringA, hData); }