LRESULT CALLBACK wpbtnKarta(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: { SetWindowLongPtr(hwnd, 0, (LONG)false); break; } case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); //Tlo FillRect(hdc, &ps.rcPaint, Okno->brSzary); //Ikona HDC hdcIkona = CreateCompatibleDC(hdc); HGDIOBJ hdcStary; LONG_PTR a = GetWindowLongPtr(hwnd, 0); if (GetWindowLongPtr(hwnd, 0) == (LONG)TRUE) { //Minus hdcStary = SelectObject(hdcIkona, Okno->imgMinus); } else { //Plus hdcStary = SelectObject(hdcIkona, Okno->imgPlus); } BitBlt(hdc, 7, 7, 9, 9, hdcIkona, 0, 0, SRCCOPY); SelectObject(hdcIkona, hdcStary); DeleteDC(hdcIkona); //Tekst RECT p2; ZeroMemory(&p2, sizeof(p2)); p2.left = 22; p2.right = 190; p2.top = 5; p2.bottom = 20; HFONT domyslna; domyslna = (HFONT)SelectObject(hdc, Okno->fntCzcionka); SetBkColor(hdc, (COLORREF)0xE3E3E3); char *t1 = new char[30]; GetWindowText(hwnd, t1, 30); if (IsWindowEnabled(hwnd)) { SetTextColor(hdc, 0); } else { SetTextColor(hdc, (COLORREF)0x999999); } DrawText(hdc, t1, -1, &p2, NULL); delete[] t1; SelectObject(hdc, domyslna); EndPaint(hwnd, &ps); return 0; } case WM_LBUTTONDOWN: { SendMessage(GetParent(hwnd), WM_COMMAND, (WPARAM)MAKELONG((WORD)GetWindowLong(hwnd, GWL_ID), BN_CLICKED), (LPARAM)hwnd); break; } case WM_ENABLE: { InvalidateRect(hwnd, NULL, true); break; } } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
/** * name: PaintThemeButton * desc: Draws the themed button * param: ctl - BTNCTRL structure for the button * hdcMem - device context to draw to * rcClient - rectangle of the whole button * return: nothing **/ static void __fastcall PaintThemeButton(BTNCTRL *ctl, HDC hdcMem, LPRECT rcClient) { RECT rcText = { 0, 0, 0, 0 }; WCHAR wszText[MAX_PATH] = { 0 }; WORD ccText; // Draw the flat button if ((ctl->dwStyle & MBS_FLAT) && ctl->hThemeToolbar) { int state = IsWindowEnabled(ctl->hwnd) ? (ctl->stateId == PBS_NORMAL && ctl->defbutton ? PBS_DEFAULTED : ctl->stateId) : PBS_DISABLED; if (IsThemeBackgroundPartiallyTransparent(ctl->hThemeToolbar, TP_BUTTON, TBStateConvert2Flat(state))) { if (SUCCEEDED(DrawThemeParentBackground(ctl->hwnd, hdcMem, rcClient))) DrawThemeParentBackground(GetParent(ctl->hwnd), hdcMem, rcClient); } DrawThemeBackground(ctl->hThemeToolbar, hdcMem, TP_BUTTON, TBStateConvert2Flat(state), rcClient, rcClient); } else { // draw themed button background if (ctl->hThemeButton) { int state = IsWindowEnabled(ctl->hwnd) ? (ctl->stateId == PBS_NORMAL && ctl->defbutton ? PBS_DEFAULTED : ctl->stateId) : PBS_DISABLED; if (IsThemeBackgroundPartiallyTransparent(ctl->hThemeButton, BP_PUSHBUTTON, state)) { if (SUCCEEDED(DrawThemeParentBackground(ctl->hwnd, hdcMem, rcClient))) DrawThemeParentBackground(GetParent(ctl->hwnd), hdcMem, rcClient); } DrawThemeBackground(ctl->hThemeButton, hdcMem, BP_PUSHBUTTON, state, rcClient, rcClient); } } // calculate text rect { RECT sizeText; HFONT hOldFont; ccText = GetWindowTextW(ctl->hwnd, wszText, sizeof(wszText) / sizeof(WCHAR)); if (ccText > 0) { hOldFont = (HFONT)SelectObject(hdcMem, ctl->hFont); GetThemeTextExtent( ctl->hThemeButton, hdcMem, BP_PUSHBUTTON, IsWindowEnabled(ctl->hwnd) ? ctl->stateId : PBS_DISABLED, wszText, ccText, DST_PREFIXTEXT, NULL, &sizeText); if (ctl->cHot) { RECT rcHot; GetThemeTextExtent(ctl->hThemeButton, hdcMem, BP_PUSHBUTTON, IsWindowEnabled(ctl->hwnd) ? ctl->stateId : PBS_DISABLED, L"&", 1, DST_PREFIXTEXT, NULL, &rcHot); sizeText.right -= (rcHot.right - rcHot.left); } SelectObject(hdcMem, hOldFont); rcText.left = (ctl->hIcon) ? 0 : (rcClient->right - rcClient->left - (sizeText.right - sizeText.left)) / 2; rcText.top = (rcClient->bottom - rcClient->top - (sizeText.bottom - sizeText.top)) / 2; rcText.right = rcText.left + (sizeText.right - sizeText.left); rcText.bottom = rcText.top + (sizeText.bottom - sizeText.top); if (ctl->stateId == PBS_PRESSED) { OffsetRect(&rcText, 1, 1); } } } PaintIcon(ctl, hdcMem, &ccText, rcClient, &rcText); // draw text if (ccText > 0 && ctl->hThemeButton) { HFONT hOldFont = (HFONT)SelectObject(hdcMem, ctl->hFont); DrawThemeText(ctl->hThemeButton, hdcMem, BP_PUSHBUTTON, IsWindowEnabled(ctl->hwnd) ? ctl->stateId : PBS_DISABLED, wszText, ccText, DST_PREFIXTEXT, 0, &rcText); SelectObject(hdcMem, hOldFont); } }
static int UIEmulateBtnClick(HWND hwndDlg, UINT idcButton) { if (IsWindowEnabled(GetDlgItem(hwndDlg, idcButton))) PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(idcButton, BN_CLICKED), (LPARAM)GetDlgItem(hwndDlg, idcButton)); return 0; }
int ExecuteEntry(HANDLE hFile, int offset, entry *thisentry) { static TCHAR buf[MAX_PATH], buf2[MAX_PATH], tmpbuf[MAX_PATH]; if (skip && thisentry->which != 15) return 0; switch (thisentry->which) { case 0: // set output directory if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf,sizeof(buf))) { if (!buf[0]) { _tcscpy(state_output_directory,state_install_directory); } else { if (process_string(state_output_directory,buf,state_install_directory)) _tcscpy(state_output_directory,state_install_directory); } log_printf3("SetOutPath: \"%s\"->\"%s\"\n",buf,state_output_directory); { INT32 args[] = { (INT32)state_output_directory }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_OUTDIR, args); update_status_text(tmpbuf); } recursive_create_directory(state_output_directory); return 0; } log_printf("SetOutPath: INSTALLER CORRUPTED\n"); break; case 1: // extract file { TCHAR tempFile[MAX_PATH]; int queueForRebootFlag = 0; int overwriteflag=thisentry->offsets[0]; LPTSTR p; _tcscpy(buf,state_output_directory); p=buf; while (*p) p=CharNext(p); if (p == buf || (CharPrev(buf,p))[0]!=_T('\\')) _tcscat(buf,_T("\\")); if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[1],buf2,MAX_PATH)) { HANDLE hOut; int ret; log_printf3("File: overwriteflag=%d, name=\"%s\"\n",overwriteflag,buf2); _tcscat(buf,buf2); _tryagain: if ((overwriteflag&3)==0) { int attr=GetFileAttributes(buf); if (attr & FILE_ATTRIBUTE_READONLY) SetFileAttributes(buf,attr^FILE_ATTRIBUTE_READONLY); } hOut=CreateFile(buf,GENERIC_WRITE,0,NULL,(overwriteflag&1)?CREATE_NEW:CREATE_ALWAYS,0,NULL); if (hOut == INVALID_HANDLE_VALUE) { if (overwriteflag&3) { INT32 args[] = { (INT32)buf }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_SKIPPED, args); update_status_text(tmpbuf); log_printf3("File: skipping: \"%s\" (overwriteflag=%d)\n",buf,overwriteflag); return 0; } log_printf2("File: error creating \"%s\"\n",buf); { INT32 args[] = { (INT32)buf }; GETRESOURCE2(tmpbuf, JAVAWS_ERROR_OPENWRITE, args); wsprintf(buf2, _T("%s"), tmpbuf); } /* If we're not in silent mode then tell the user up front that */ /* the file is locked. Otherwise (silent mode), queue the file */ /* for copy on next reboot. */ if (noisy) { switch (MessageBox(g_hwnd,buf2,g_caption,MB_ABORTRETRYIGNORE|MB_ICONSTOP)) { case IDABORT: log_printf("File: on error, user selected abort.\n"); { INT32 args[]={ (INT32)buf }; GETRESOURCE2(tmpbuf, JAVAWS_ERROR_ABORTWRITE, args); update_status_text(tmpbuf); } return -2; case IDRETRY: log_printf("File: on error, user selected retry.\n"); goto _tryagain; case IDIGNORE: log_printf("File: on error, user selected cancel.\n"); return 0; } } else { /* try to queue the file for copy on reboot */ GetTempFileName(g_tempdir, "jws", 0, tempFile); hOut=CreateFile(tempFile,GENERIC_WRITE,0,NULL,(overwriteflag&1)?CREATE_NEW:CREATE_ALWAYS,0,NULL); if (hOut == INVALID_HANDLE_VALUE) return 0; queueForRebootFlag = 1; } } { INT32 args[] = { (INT32)buf }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_EXTRACT, args); update_status_text(tmpbuf); } ret=GetCompressedDataFromDataBlock(hFile,offset+thisentry->offsets[2],hOut); log_printf3("File: wrote %d to \"%s\"\n",ret,buf); CloseHandle(hOut); if (ret >= 0) { if (queueForRebootFlag == 1) { TCHAR winini[MAX_PATH]; TCHAR shortname[MAX_PATH]; TCHAR rebootFlagFile[MAX_PATH]; int len; _tcscpy(rebootFlagFile, g_tempdir); _tcscat(rebootFlagFile, JAVAWS_REBOOT_FILENAME); if (IsRunningOnNT4() || IsRunningOn2000XP()) { MoveFileEx(tempFile, buf, MOVEFILE_DELAY_UNTIL_REBOOT); MoveFileEx(rebootFlagFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); } else { /* queue for copy on boot; tempFile is the file to be copied */ /* buf holds the target filename that was locked previously. */ GetWindowsDirectory(winini, MAX_PATH); /* append a trailing backslash if necessary */ len = _tcslen(winini); if (winini[len - 1] != '\\') { winini[len] = '\\'; winini[len+1] = 0; } _tcscat(winini, "WININIT.INI"); /* write to the wininit.ini file to queue the file for copy on */ /* reboot. */ GetShortPathName(buf, shortname, MAX_PATH); WritePrivateProfileString("rename", shortname, tempFile, winini); /* write the wininit.ini file to tell Windows to delete the */ /* reboot flag file after it reboots */ WritePrivateProfileString("rename", "NUL", rebootFlagFile, winini); } /* write the reboot flag file */ WritePrivateProfileString(JAVAWS_APPLICATION_NAME, JAVAWS_REBOOT_KEY, "1", rebootFlagFile); state_reboot_needed = 1; } return ret; } if (ret == -3 || ret == -6) { log_printf2("File: INSTALLER CORRUPTED (gcdfdb:%d)\n",ret); goto installer_corrupted; } else { DeleteFile(buf); log_printf("File: error writing. deleted.\n"); return -2; } } log_printf("File: INSTALLER CORRUPTED\n"); } break; case 2: // execute program { PROCESS_INFORMATION ProcInfo={0,}; STARTUPINFO StartUp={sizeof(STARTUPINFO),}; int disabled = 0; if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf2,sizeof(buf2))) { log_printf2("Exec: command=\"%s\"\n",buf2); if (process_string(buf,buf2,state_install_directory)) _tcscpy(buf,buf2); { INT32 args[] = { (INT32)buf }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_EXECUTE, args); update_status_text(tmpbuf); } if (IsWindowEnabled(GetDlgItem(g_hwnd,IDOK))!=0) { /* if Next button is already disabled, don't disable */ /* and re-enable it. (bug 4624948) */ EnableWindow(GetDlgItem(g_hwnd,IDOK), 0); disabled = 1; } if (CreateProcess( NULL, buf, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, state_output_directory, &StartUp, &ProcInfo) ) { log_printf2("Exec: success (\"%s\")\n",buf); if (NULL != ProcInfo.hThread) CloseHandle( ProcInfo.hThread ); if (NULL != ProcInfo.hProcess) { if (thisentry->offsets[1]==1) { WaitForSingleObject(ProcInfo.hProcess,INFINITE); ShowWindow(g_hwnd,SW_HIDE); ShowWindow(g_hwnd,SW_SHOW); InvalidateRect(g_hwnd,NULL,TRUE); UpdateWindow(g_hwnd); while (1) { MSG msg; if (!PeekMessage(&msg,g_hwnd,WM_PAINT,WM_PAINT,PM_REMOVE)) break; DispatchMessage(&msg); } } { DWORD exitcode; if (!GetExitCodeProcess(ProcInfo.hProcess, (LPDWORD)&exitcode)) { log_printf("Exec: failed getting exit code\n"); state_return_value = STATE_RETURN_INVALID; } else { state_return_value = exitcode; } } CloseHandle( ProcInfo.hProcess ); } } else { log_printf2("Exec: failed createprocess (\"%s\")\n",buf); } if (disabled != 0) { EnableWindow(GetDlgItem(g_hwnd,IDOK), 1); } return 0; } log_printf("Exec: INSTALLER CORRUPTED\n"); } break; case 3: // register DLL #ifdef NSIS_SUPPORT_ACTIVEXREG if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf2,sizeof(buf2))) { HRESULT hr; hr=OleInitialize(NULL); if (hr == S_OK || hr == S_FALSE) { if (!process_string(buf,buf2,state_install_directory)) { HANDLE h; int is_uninstall=0; if (buf[0] == _T('-') && buf[1] == _T(' ')) is_uninstall=2; h=LoadLibrary(buf+is_uninstall); if (h) { FARPROC funke = GetProcAddress(h,is_uninstall?"DllUnregisterServer":"DllRegisterServer"); if (funke) { if (!is_uninstall) { INT32 args[] = { (INT32)buf }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_REGDLL, args); update_status_text(tmpbuf); } else { INT32 args[] = { (INT32)buf+is_uninstall }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_UNREGDLL, args); update_status_text(tmpbuf); } funke(); } else if (!is_uninstall) { INT32 args[] = { (INT32)buf }; GETRESOURCE2(buf2,JAVAWS_ERROR_REGDLL,args); if (noisy) MessageBox(g_hwnd,buf2,g_caption,MB_OK); } FreeModule(h); } else if (!is_uninstall) { INT32 args[] = { (INT32)buf }; GETRESOURCE2(buf2,JAVAWS_ERROR_REGDLLU, args); if (noisy) MessageBox(g_hwnd,buf2,g_caption,MB_OK); } } if (hr == S_OK) OleUninitialize(); } else { INT32 args[] = { (INT32)buf }; GETRESOURCE2(buf2,JAVAWS_ERROR_OLEINIT,args); if (noisy) MessageBox(g_hwnd,buf2,g_caption,MB_OK); } return 0; } #endif break; case 4: // install netscape plug-in case 11: #ifdef NSIS_SUPPORT_NETSCAPEPLUGINS #warning NSIS_SUPPORT_NETSCAPEPLUGINS defined, this section NOT internationalized, proceed with caution! if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf2,sizeof(buf2))) { HKEY hKey; if ( RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Netscape\\Netscape Navigator",0,KEY_READ,&hKey) == ERROR_SUCCESS) { int x=0; while (1) { FILETIME pft; char name[256]; HKEY subKey; DWORD lname=sizeof(name); if (RegEnumKeyEx(hKey,x++,name,&lname,NULL,NULL,NULL,&pft) != ERROR_SUCCESS) break; mini_strcat(name,"\\Main"); if (RegOpenKeyEx(hKey,name,0,KEY_READ,&subKey) == ERROR_SUCCESS) { int l = sizeof(buf); int t=REG_SZ; if (RegQueryValueEx(subKey,"Plugins Directory",NULL,&t,buf,&l ) == ERROR_SUCCESS && t == REG_SZ) { mini_strcat(buf,"\\"); mini_strcat(buf,buf2); { HANDLE hOut=INVALID_HANDLE_VALUE; retryagainns: { int attr=GetFileAttributes(buf); if (attr & FILE_ATTRIBUTE_READONLY) SetFileAttributes(buf,attr^FILE_ATTRIBUTE_READONLY); } hOut=CreateFile(buf,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); if (thisentry->which != 4) { if (hOut != INVALID_HANDLE_VALUE) { CloseHandle(hOut); hOut=(HANDLE)1; if (!DeleteFile(buf)) { log_printf2("InstNSPlug: error removing: %s\n",buf); hOut=INVALID_HANDLE_VALUE; } else log_printf2("InstNSPlug: removed: %s\n",buf); } else hOut=(HANDLE)1; } if (hOut == INVALID_HANDLE_VALUE) { if (MessageBox(g_hwnd,"Error accessing Netscape plug-in.\r\nMake sure all windows of Netscape are closed.\r\nHit Retry to try again, Cancel to skip",g_caption,MB_RETRYCANCEL|MB_APPLMODAL|MB_TOPMOST)==IDOK) goto retryagainns; log_printf2("InstNSPlug: install to %s aborted by user.\n",buf); } if (hOut != INVALID_HANDLE_VALUE && thisentry->which == 4) { int ret=GetCompressedDataFromDataBlock(hFile,offset+thisentry->offsets[1],hOut); CloseHandle(hOut); if (ret<0) { DeleteFile(buf); if (ret==-3) { log_printf("InstNSPlug: INSTALLER CORRUPTED (2)\n"); goto installer_corrupted; } log_printf2("InstNSPlug: couldn't write to: %s\n",buf); } else { update_status_text("installed netscape plug-in: ",buf); log_printf2("InstNSPlug: wrote: %s\n",buf); } } else if (thisentry->which == 11) { update_status_text("removed netscape plug-in: ",buf); } } } RegCloseKey(subKey); } } RegCloseKey(hKey); } else { log_printf("InstNSPlug: Netscape registry settings not found\n"); } return 0; } #endif log_printf("InstNSPlug: INSTALLER CORRUPTED\n"); break; case 12: if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[1],buf,sizeof(buf))) { int rootkey=thisentry->offsets[0]; if (thisentry->offsets[2] != -1) { HKEY hKey; if (RegOpenKey((HKEY)rootkey,buf,&hKey) == ERROR_SUCCESS) { if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[2],buf2,sizeof(buf2))) { if (process_string(buf,buf2,state_install_directory)) _tcscpy(buf,buf2); RegDeleteValue(hKey,buf); } RegCloseKey(hKey); } } else { log_printf3("DeleteRegKey: %d\\%s\n",rootkey,buf); RegDeleteKey((HKEY)rootkey,buf); } return 0; } break; case 5: // write registry value if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[1],buf,sizeof(buf)) && !GetStringFromDataBlock(hFile,offset+thisentry->offsets[2],buf2,sizeof(buf2))) { int rootkey=thisentry->offsets[0]; int type=thisentry->offsets[4]; HKEY hKey; if (RegCreateKey((HKEY)rootkey,buf,&hKey) == ERROR_SUCCESS) { TCHAR buf4[MAX_PATH]; if (type == 1) { if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[3],buf4,sizeof(buf4))) { TCHAR buf3[MAX_PATH]; if (process_string(buf3,buf4,state_install_directory)) _tcscpy(buf3,buf4); if (process_string(buf4,buf2,state_install_directory)) _tcscpy(buf4,buf2); log_printf5("WriteRegStr: set %d\\%s\\%s to %s\n",rootkey,buf,buf4,buf3); RegSetValueEx(hKey,buf4,0,REG_SZ,buf3,_tcslen(buf3)+1); } } else if (type == 2) { if (process_string(buf4,buf2,state_install_directory)) _tcscpy(buf4,buf2); log_printf5("WriteRegDword: set %d\\%s\\%s to %d\n",rootkey,buf,buf4,thisentry->offsets[3]); RegSetValueEx(hKey,buf4,0,REG_DWORD,(BYTE*)&thisentry->offsets[3],4); } else if (type == 3) { BYTE data[512]; int len=GetCompressedDataFromDataBlockToMemory(hFile, offset+thisentry->offsets[3], data,sizeof(data)); if (len >= 0) { if (process_string(buf4,buf2,state_install_directory)) _tcscpy(buf4,buf2); RegSetValueEx(hKey,buf4,0,REG_BINARY,data,len); } log_printf5("WriteRegBin: set %d\\%s\\%s with %d bytes\n",rootkey,buf,buf4,len); } RegCloseKey(hKey); } else { log_printf3("WriteReg: error creating key %d\\%s\n",rootkey,buf); } if (type > 0 && type < 4) return 0; } log_printf("WriteReg: INSTALLER CORRUPTED\n"); break; case 6: { TCHAR section[MAX_PATH]; TCHAR name[MAX_PATH]; TCHAR t[MAX_PATH]; TCHAR t2[MAX_PATH]; if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],section,sizeof(section)) && !GetStringFromDataBlock(hFile,offset+thisentry->offsets[1],name,sizeof(name)) && !GetStringFromDataBlock(hFile,offset+thisentry->offsets[2],buf,sizeof(buf)) && !GetStringFromDataBlock(hFile,offset+thisentry->offsets[3],buf2,sizeof(buf2))) { if (process_string(t,buf2,state_install_directory)) _tcscpy(t,buf2); if (process_string(buf2,buf,state_install_directory)) _tcscpy(buf2,buf); if (process_string(t2,name,state_install_directory)) _tcscpy(t2,name); if (process_string(buf,section,state_install_directory)) _tcscpy(buf,section); log_printf5("WriteINIStr: wrote [%s] %s=%s in %s\n",buf,t2,buf2,t); WritePrivateProfileString(buf,t2,buf2,t); return 0; } log_printf("WriteINIStr: INSTALLER CORRUPTED\n"); } break; case 7: #ifdef NSIS_SUPPORT_CREATESHORTCUT { TCHAR scf[MAX_PATH],iconfile[MAX_PATH], parms[MAX_PATH]; int iindex=thisentry->offsets[4]; if (GetStringFromDataBlock(hFile,offset+thisentry->offsets[3],buf,sizeof(buf))) break; if (process_string(iconfile,buf,state_install_directory)) break; if (GetStringFromDataBlock(hFile,offset+thisentry->offsets[2],buf,sizeof(buf))) break; if (process_string(parms,buf,state_install_directory)) break; if (GetStringFromDataBlock(hFile,offset+thisentry->offsets[1],buf,sizeof(buf))) break; if (process_string(buf2,buf,state_install_directory)) break; if (GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf,sizeof(buf))) break; if (process_string(scf,buf,state_install_directory)) break; log_printf6("CreateShortCut: out: \"%s\", in: \"%s %s\", icon: %s,%d\n",scf,buf2,parms,iconfile,iindex); CreateShortCut(g_hwnd, scf, iconfile[0]?iconfile:NULL, iindex, buf2, parms[0]?parms:NULL,state_output_directory); { INT32 args[] = { (INT32)scf }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_CREATESHORTCUT, args); update_status_text(tmpbuf); } return 0; } #endif log_printf("CreateShortCut: INSTALLER CORRUPTED\n"); break; case 8: if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf,sizeof(buf))) { log_printf2("Delete: \"%s\"\n",buf); if (!process_string(buf2,buf,state_install_directory)) { HANDLE h; WIN32_FIND_DATA fd; LPTSTR p=buf; _tcscpy(buf,buf2); while (*p) p=CharNext(p); while (p > buf && *p != _T('\\')) p=CharPrev(buf, p); *p=_T('\0'); h=FindFirstFile(buf2,&fd); if (h != INVALID_HANDLE_VALUE) { do { if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { wsprintf(buf2,_T("%s\\%s"),buf,fd.cFileName); log_printf2("Delete: DeleteFile(\"%s\")\n",buf2); { INT32 args[] = { (INT32)buf2 }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_DELETEFILE, args); update_status_text(tmpbuf); } DeleteFile(buf2); } } while (FindNextFile(h,&fd)); FindClose(h); } } else { log_printf("Delete: error parsing parameter\n"); } return 0; } log_printf("Delete: INSTALLER CORRUPTED\n"); break; case 9: if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[1],buf,sizeof(buf))) { int whattodo=thisentry->offsets[0]; log_printf3("FindWindow: checking for window class: %s . whattodo=%d\n",buf,whattodo); if (whattodo==2) { if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[2],buf2,sizeof(buf2))) { while (FindWindow(buf,NULL)) { int r=noisy ? MessageBox(g_hwnd,buf2,g_caption,MB_ABORTRETRYIGNORE) : IDIGNORE; if (r == IDABORT) { log_printf("FindWindow: user abort\n"); { INT32 args[] = { (INT32)buf }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_ABORTED, args); update_status_text(tmpbuf); } return -2; } if (r == IDIGNORE) { log_printf("FindWindow: user ignore\n"); break; } } } else { log_printf("FindWindow: INSTALLER CORRUPTED\n"); break; } } else if (whattodo==1) { HWND hwnd=FindWindow(buf,NULL); if (hwnd) { log_printf2("FindWindow: closing window (%s) (one-shot)\n",buf); SendMessage(hwnd,WM_CLOSE,0,0); } } else if (whattodo==0) { HWND hwnd; int r=8; while ((hwnd=FindWindow(buf,NULL))) { SendMessage(hwnd,WM_CLOSE,0,0); Sleep(250); if (r--<0) { break; } } if (!hwnd) { log_printf3("FindWindow: closed window (%s) (multi-try). %d\n",buf,r); } else { log_printf2("FindWindow: gave up closing window (%s)\n",buf); } } return 0; } log_printf("FindWindow: INSTALLER CORRUPTED\n"); break; case 10: // MessageBox if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[1],buf,sizeof(buf))) { if (!process_string(buf2, buf, state_install_directory)) { log_printf3("MessageBox: %d,\"%s\"\n",thisentry->offsets[0],buf2); if (noisy) { DWORD ret=MessageBox(g_hwnd,buf2,g_caption,thisentry->offsets[0]); if ( ret == IDNO || ret == IDCANCEL) { state_return_value=0; } else { state_return_value=1; } } } else { log_printf("MessageBox: error parsing parameter\n"); } return 0; } log_printf("MessageBox: INSTALLER CORRUPTED\n"); break; case 13: //RMDir if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf,sizeof(buf))) { log_printf2("RMDir: \"%s\"\n",buf); if (!process_string(buf2,buf,state_install_directory)) { log_printf2("RMDir: RemoveDirectory(\"%s\")\n",buf2); { INT32 args[] = { (INT32)buf }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_REMOVEDIR, args); update_status_text(tmpbuf); } RemoveDirectory(buf2); } else { log_printf("RMDir: error parsing parameter\n"); } return 0; } log_printf("RMDir: INSTALLER CORRUPTED\n"); break; case 19: if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf,sizeof(buf))) { log_printf2("RMDirRecursive: \"%s\"\n",buf); if (!process_string(buf2,buf,state_install_directory)) { SHFILEOPSTRUCT fos; log_printf2("RMDirRecursive: RemoveDirectory(\"%s\")\n",buf2); { INT32 args[] = { (INT32)buf }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_REMOVEDIR, args); update_status_text(tmpbuf); } buf2[_tcslen(buf2)]=0; buf2[_tcslen(buf2)+1]=0; if (GetFileAttributes(buf2)!=0xffffffff) { // Only do SHFileOperation if file exists fos.hwnd = g_hwnd; fos.wFunc = FO_DELETE; fos.pFrom = buf2; fos.pTo = NULL; fos.fFlags = FOF_SILENT | FOF_NOERRORUI | FOF_NOCONFIRMATION; fos.hNameMappings = NULL; fos.lpszProgressTitle = NULL; SHFileOperation(&fos); } } else { log_printf("RMDirRecursive: error parsing parameter\n"); } return 0; } log_printf("RMDirRecursive: INSTALLER CORRUPTED\n"); break; case 14: // If if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf,sizeof(buf))) { log_printf2("If: \"%s\"\n",buf); if (!process_string(buf2,buf,state_install_directory)) { int ret=0; log_printf2("If(variables evaluated): (\"%s\")\n",buf2); if (!(ret=evalStr(buf2))) { skip=1; return 0; } } else { log_printf("If: error parsing parameter\n"); } return 0; } log_printf("If: INSTALLER CORRUPTED\n"); break; case 15: //EndIf skip=0; return 0; break; case 16: //RebootBox if (noisy) { GETRESOURCE(buf,JAVAWS_MESSAGE_REBOOT); if (MessageBox(g_hwnd,buf,g_caption,MB_YESNO|MB_ICONWARNING)==IDYES) { if (!ExitWindowsEx(EWX_REBOOT, (DWORD)0)) { GETRESOURCE(buf,JAVAWS_ERROR_EXITWINDOWS); if (noisy) MessageBox(g_hwnd,buf,g_caption,MB_OK); } } } return 0; break; case 17: //Browser if (!noisy) return 0; if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf,sizeof(buf))) { log_printf2("Browser: \"%s\"\n",buf); if (!process_string(buf2,buf,state_install_directory)) { ShellExecute(g_hwnd, "open", buf2, "-new", state_install_directory, 0); } else { log_printf("Browser: error parsing parameter\n"); } return 0; } log_printf("Browser: INSTALLER CORRUPTED\n"); break; case 18: // AltDirBox { TCHAR name[MAX_PATH]; TCHAR buf3[MAX_PATH]; TCHAR buf4[MAX_PATH]; if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf,sizeof(buf)) && !GetStringFromDataBlock(hFile,offset+thisentry->offsets[1],name,sizeof(name)) && !GetStringFromDataBlock(hFile,offset+thisentry->offsets[2],buf3,sizeof(buf3))) { if (!process_string(tmpbuf,buf,state_install_directory) && !process_string(buf4,buf3,state_install_directory) && !process_string(buf2,name,state_install_directory)) { _tcscpy(state_alt_directory,tmpbuf); _tcscpy(state_alt_name, buf2); _tcscpy(state_alt_version,buf4); state_return_value = noisy ? DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_DIR1),g_hwnd,DirProc2): 1; } return 0; } } break; case 41: if (!GetStringFromDataBlock(hFile,offset+thisentry->offsets[0],buf,sizeof(buf))) { log_printf2("MKDir: \"%s\"\n",buf); if (!process_string(buf2,buf,state_install_directory)) { log_printf2("MKDir: recursive_create_directory(\"%s\")\n",buf2); { INT32 args[] = { (INT32)buf }; GETRESOURCE2(tmpbuf, JAVAWS_STATUS_MAKEDIR, args); update_status_text(tmpbuf); } recursive_create_directory(buf2); } else { log_printf("RMDir: error parsing parameter\n"); } return 0; } log_printf("MKDir: INSTALLER CORRUPTED\n"); break; } installer_corrupted: { GETRESOURCE(tmpbuf, JAVAWS_ERROR_INSTCORRUPT); if (noisy) MessageBox(g_hwnd,tmpbuf,g_caption,MB_OK|MB_ICONSTOP); } return -1; }
bool CIVStatusBar::IsOverURL(CPoint pt, CString & rstr ) { if ( ! IsWindowEnabled() || !GetTopLevelParent()->IsWindowEnabled() ) return false; CStatusBarCtrl & sb = GetStatusBarCtrl(); int iPart = -1; CRect rc; for (int i=0; i < sb.GetParts(0, NULL); i++ ) { sb.GetRect (i, rc); if (rc.PtInRect(pt) && ( GetPaneStyle(i) & SBT_OWNERDRAW ) ) { iPart = i; break; } } if (iPart == -1) return false; if ( ! (GetPaneStyle(iPart) & SBPS_NOBORDERS) ) rc.InflateRect(-GetSystemMetrics(SM_CYBORDER), -GetSystemMetrics(SM_CXBORDER)); if (!rc.PtInRect(pt)) return false; CString strText = GetPaneText(iPart); CDC * pDC = GetDC(); CFont * pFont = GetFont(); CFont fntURL; GetLinkFont(fntURL); CFont * pOldFont = pDC->SelectObject (pFont); int x = CalcX (pDC, rc, strText); bool bFound = false; for (int i = 0; i < strText.GetLength();) { CSize szPos = FindURL (strText, i ); if (szPos.cx != -1) { CString strStart = strText.Mid (i, szPos.cx-i); CRect rcURL; x += pDC->GetTextExtent (strStart).cx; rcURL.left = x; pFont = pDC->SelectObject (&fntURL); CString strURL = strText.Mid(szPos.cx, szPos.cy); CSize szURL = pDC->GetTextExtent (strURL); x += szURL.cx; rcURL.right = x; rcURL.top = rc.top; rcURL.bottom = rc.top + szURL.cy; pDC->SelectObject (pFont); if (rcURL.PtInRect(pt)) { rstr = strURL; bFound = true; break; } i = szPos.cx + szPos.cy; } else break; } pDC->SelectObject (pOldFont); return bFound; }
void CMlsBitmapButton::DrawButton(CDC* pDC) { // Upack the state of the button. DWORD dwState = SendMessage(BM_GETSTATE, 0, 0); DWORD dwCode = SendMessage(WM_GETDLGCODE, 0, 0); BOOL fSelected = (dwState & 4) != 0; BOOL fFocused = (dwState & 8) != 0; BOOL fDisabled = !IsWindowEnabled(); BOOL fDefault = (dwCode & DLGC_DEFPUSHBUTTON) != 0; // Create a bitmap which will be used to draw the button image. // When the bitmap is complete, it will be drawn onto the button. CRect crButton; GetClientRect(crButton); CBitmap bmButton; bmButton.CreateCompatibleBitmap(pDC, crButton.Width(), crButton.Height()); CDC dcButton; dcButton.CreateCompatibleDC(pDC); CPalette* pOldPalette = NULL; CPalette* pOldButtonPalette = NULL; if (m_pPalette != NULL) { pDC->SelectPalette(m_pPalette, FALSE); pDC->RealizePalette(); pOldButtonPalette = dcButton.SelectPalette(m_pPalette, FALSE); } dcButton.SelectObject(&bmButton); // Initialize the button bitmap to the button face color. Util::FillRectangleWithColor(dcButton, crButton, m_clFace); // Compute the area available for content. CRect crContent(crButton); crContent.InflateRect(-MinimumMargin, -MinimumMargin); CRect crTextContent(crContent); // Compute the bitmap dimensions and its nominal position. Adjust crTextContent to the // area which is available next to the bitmap. CRect crBitmap; crBitmap.SetRectEmpty(); if (!crContent.IsRectEmpty()) { if (m_fHaveBitmap) { crBitmap.SetRect(0, 0, m_nBitmapWidth, m_nBitmapHeight); // Set first bitmap position base on major alignment type. switch (m_Alignment) { case Left: { crBitmap.OffsetRect(crContent.left, crContent.top+(crContent.Height()-crBitmap.Height())/2); crTextContent.left += crBitmap.Width()+Separator; break; } case Right: { crBitmap.OffsetRect(crContent.right-crBitmap.Width(), crContent.top+(crContent.Height()-crBitmap.Height())/2); crTextContent.right -= crBitmap.Width()+Separator; break; } case Top: { crBitmap.OffsetRect(crContent.left+(crContent.Width()-crBitmap.Width())/2, crContent.top); crTextContent.top += crBitmap.Height()+Separator; break; } case Bottom: { crBitmap.OffsetRect(crContent.left+(crContent.Width()-crBitmap.Width())/2, crContent.bottom-crBitmap.Height()); crTextContent.bottom -= crBitmap.Height()+Separator; break; } default: { ASSERT(FALSE); } } } else { crBitmap.SetRectEmpty(); } } // Compute the text dimensions and its nominal position. CRect crText; crText.SetRectEmpty(); CString csText; if (!crTextContent.IsRectEmpty()) { GetWindowText(csText); if (!csText.IsEmpty()) { // Get the font which we are using for the text. CFont* pFont = GetFont(); if (pFont != NULL) { // Select the font we are going to use for drawing the text. dcButton.SelectObject(pFont); // Compute the extent of the text. The text is formatted into the area next to // the button. If the text is multiple line, the full width is always used. crText.SetRect(0, 0, crTextContent.Width(), crTextContent.Height()); int nTextHeight = Util::DrawText(&dcButton, csText, crText, DT_CALCRECT | (m_fMultipleLine ? (m_fWordWrap ? DT_WORDBREAK : 0) : DT_SINGLELINE)); // Build the rectangle that has the dimensions of the text. crText.bottom = nTextHeight; // Clip to content dimensions. if (crText.Width() > crTextContent.Width()) { crText.right = crTextContent.Width(); } if (crText.Height() > crTextContent.Height()) { crText.bottom = crTextContent.Height(); } // Adjust text rectangle within content rectangle. int nXOffset = 0; int nYOffset = 0; switch (m_Alignment) { case Left: case Right: { switch (m_nVariation) { case 0: nXOffset = 0; break; case 1: nXOffset = (crTextContent.Width()-crText.Width())/2; break; case 2: nXOffset = (crTextContent.Width()-crText.Width()); break; case 3: nXOffset = 0; break; } if (m_Alignment == Right) { nXOffset = (crTextContent.Width()-crText.Width())-nXOffset; } nYOffset = (crTextContent.Height()-crText.Height())/2; break; } case Top: case Bottom: { switch (m_nVariation) { case 0: nYOffset = 0; break; case 1: nYOffset = (crTextContent.Height()-crText.Height())/2; break; case 2: nYOffset = (crTextContent.Height()-crText.Height()); break; case 3: nYOffset = 0; break; } if (m_Alignment == Bottom) { nYOffset = (crTextContent.Height()-crText.Height())-nYOffset; } nXOffset = (crTextContent.Width()-crText.Width())/2; break; } default: { ASSERT(FALSE); } } crText.OffsetRect(crTextContent.left+nXOffset, crTextContent.top+nYOffset); } } } // If the layout variation is 3, then center both the bitmap and text within the // content rectangle. if (!crContent.IsRectEmpty()) { if (m_nVariation == 3) { // Compute the rectangle which encloses both the bitmap and text. CRect crBoth; crBoth.SetRectEmpty(); if (!crBitmap.IsRectEmpty()) { crBoth |= crBitmap; } if (!crText.IsRectEmpty()) { crBoth |= crText; } // Move the bitmap and text back to the content rectangle. int nXOffset = 0; int nYOffset = 0; switch (m_Alignment) { case Left: case Right: { nXOffset = (crContent.Width()-crBoth.Width())/2; if (m_Alignment == Right) { nXOffset = -nXOffset; } break; } case Top: case Bottom: { nYOffset = (crContent.Height()-crBoth.Height())/2; if (m_Alignment == Bottom) { nYOffset = -nYOffset; } break; } default: { ASSERT(FALSE); } } // Adjust the bitmap and text rectangles. crBitmap.OffsetRect(nXOffset, nYOffset); crText.OffsetRect(nXOffset, nYOffset); } } // If the button is selected, offset the bitmap and text. if (fSelected) { crBitmap.OffsetRect(1, 1); crText.OffsetRect(1, 1); } // Draw the bitmap onto the button image at the computed position. if (!crBitmap.IsRectEmpty()) { CDC dcBitmap; dcBitmap.CreateCompatibleDC(pDC); // Erase to 0's (black) the areas of the button where the opaque portions // of the bitmap will be drawn. dcButton.SetTextColor(RGB(0,0,0)); dcButton.SetBkColor(RGB(255,255,255)); dcBitmap.SelectObject(&m_bmMask); dcButton.BitBlt(crBitmap.left, crBitmap.top, crBitmap.Width(), crBitmap.Height(), &dcBitmap, 0, 0, SRCAND); // Draw the bitmap onto the button. dcBitmap.SelectObject(&m_bmBitmap); dcButton.BitBlt(crBitmap.left, crBitmap.top, crBitmap.Width(), crBitmap.Height(), &dcBitmap, 0, 0, SRCPAINT); } // Draw the text onto the button image at the computed position. if (!crText.IsRectEmpty()) { // Draw the text. dcButton.SetTextColor(m_clText); dcButton.SetBkMode(TRANSPARENT); Util::DrawText(&dcButton, csText, crText, (m_fMultipleLine ? (DT_CENTER | (m_fWordWrap ? DT_WORDBREAK : 0)) : DT_SINGLELINE)); } // If the button is disabled, indicate this by embossing the bitmap. if (fDisabled) { Util::Emboss(dcButton, crButton, m_clFace, m_clHilight, m_clShadow, m_clHilight); } // Draw the button in its current state. if (fSelected) { // Button is selected, draw a black border with a shadow border inside. CRect crDraw(crButton); Util::DrawBorderWithColor(dcButton, crDraw, m_clText, 1); crDraw.InflateRect(-1, -1); Util::DrawBorderWithColor(dcButton, crDraw, m_clShadow, 1); } else { CRect crDraw(crButton); // If the button is focused or the default button, draw a // black border around it. The rest of the image moves in // to make room. if (fFocused | fDefault) { Util::DrawBorderWithColor(dcButton, crDraw, m_clText, 1); crDraw.InflateRect(-1, -1); } // Draw the raised 3D border: // // W-----------WB // | D| // | || // | || // WD----------D| // B------------B CRect crSide; // W horizontal crSide.SetRect(crDraw.left, crDraw.top, crDraw.right-1, crDraw.top+1); Util::FillRectangleWithColor(dcButton, crSide, m_clHilight); // W vertical crSide.SetRect(crDraw.left, crDraw.top+1, crDraw.left+1, crDraw.bottom-1); Util::FillRectangleWithColor(dcButton, crSide, m_clHilight); // B horizontal crSide.SetRect(crDraw.left, crDraw.bottom-1, crDraw.right, crDraw.bottom); Util::FillRectangleWithColor(dcButton, crSide, BITBTN_COLOR_OUTER_SHADOW); // B vertical crSide.SetRect(crDraw.right-1, crDraw.top, crDraw.right, crDraw.bottom-1); Util::FillRectangleWithColor(dcButton, crSide, BITBTN_COLOR_OUTER_SHADOW); // D horizontal crSide.SetRect(crDraw.left+1, crDraw.bottom-2, crDraw.right-1, crDraw.bottom-1); Util::FillRectangleWithColor(dcButton, crSide, m_clShadow); // D vertical crSide.SetRect(crDraw.right-2, crDraw.top+1, crDraw.right-1, crDraw.bottom-2); Util::FillRectangleWithColor(dcButton, crSide, m_clShadow); } // If the button is focused, draw the focus rectangle. if (fFocused) { CRect crDraw(crButton); crDraw.InflateRect(-4, -4); dcButton.DrawFocusRect(crDraw); } // Copy the bitmap onto the button. pDC->BitBlt(crButton.left, crButton.top, crButton.Width(), crButton.Height(), &dcButton, 0, 0, SRCCOPY); if (pOldPalette != NULL) { pDC->SelectPalette(pOldPalette, FALSE); } if (pOldButtonPalette != NULL) { pDC->SelectPalette(pOldButtonPalette, FALSE); } dcButton.DeleteDC(); bmButton.DeleteObject(); }
LRESULT TStemDialog::DefStemDialogProc(HWND Win,UINT Mess,WPARAM wPar,LPARAM lPar) { StemDialog_RetDefVal=0; TStemDialog *This; switch (Mess){ case WM_SYSCOMMAND: switch (wPar){ case SC_MONITORPOWER: if (runstate == RUNSTATE_RUNNING) return 0; break; case SC_SCREENSAVE: if (runstate == RUNSTATE_RUNNING || FullScreen) return 0; break; } break; case WM_MOVING:case WM_SIZING: if (FullScreen){ RECT *rc=(RECT*)lPar; if (rc->top<MENUHEIGHT){ if (Mess==WM_MOVING) rc->bottom+=MENUHEIGHT-rc->top; rc->top=MENUHEIGHT; StemDialog_RetDefVal=true; return true; } RECT LimRC={0,MENUHEIGHT+GetSystemMetrics(SM_CYFRAME), GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)}; ClipCursor(&LimRC); } break; case WM_MOVE: { GET_THIS; RECT rc; GetWindowRect(Win,&rc); if (FullScreen){ if (IsIconic(StemWin)==0 && IsZoomed(StemWin)==0){ This->FSLeft=rc.left;This->FSTop=rc.top; } }else{ if (IsIconic(Win)==0 && IsZoomed(Win)==0){ This->Left=rc.left;This->Top=rc.top; } } break; } case WM_CAPTURECHANGED: //Finished if (FullScreen) ClipCursor(NULL); break; case WM_ACTIVATE: if (wPar==WA_INACTIVE){ GET_THIS; This->Focus=GetFocus(); }else{ if (IsWindowEnabled(Win)==0){ PostMessage(StemWin,WM_USER,12345,(LPARAM)Win); } } break; case WM_SETFOCUS: GET_THIS; SetFocus(This->Focus); break; } return 0; }
LRESULT CALLBACK Select_CDROM_Window_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: Select_CDROM_Window_CreateChildWindows(hWnd); break; case WM_CLOSE: DestroyWindow(select_cdrom_window); return 0; case WM_MENUSELECT: case WM_ENTERSIZEMOVE: case WM_NCLBUTTONDOWN: case WM_NCRBUTTONDOWN: // Prevent audio stuttering when one of the following events occurs: // - Menu is opened. // - Window is resized. // - Left/Right mouse button down on title bar. Win32_ClearSoundBuffer(); break; case WM_COMMAND: // Button press, or Enter pressed in textbox switch (LOWORD(wParam)) { case IDOK: // Standard dialog button ID case IDC_BTN_OK: case IDC_BTN_SAVE: if (!IsWindowEnabled(SelCD_btnOK)) break; SelCD_Save(); DestroyWindow(hWnd); break; case IDC_BTN_APPLY: if (!IsWindowEnabled(SelCD_btnApply)) break; SelCD_Save(); break; case IDCANCEL: // Standard dialog button ID case IDC_BTN_CANCEL: DestroyWindow(hWnd); break; } break; case WM_DESTROY: if (hWnd != select_cdrom_window) break; select_cdrom_window = NULL; break; } return DefWindowProc(hWnd, message, wParam, lParam); }
//---------------------------------------------------------------- bool check_box::is_activate() const { NYX_ASSERT(hwnd_ != NULL); return IsWindowEnabled(hwnd_) != 0; }
INT_PTR CALLBACK DlgProcDisplayAttr(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam, int no) { HWND hwnd; int x, y; RECT rect; POINT pt; CHOOSECOLORW cc; PAINTSTRUCT ps; HDC hdc; static COLORREF colCust[16]; switch(message) { case WM_INITDIALOG: for(int i = 0; i < _countof(cbAttrID); i++) { for(int j = 0; j < _countof(cbAttrText); j++) { SendMessageW(GetDlgItem(hDlg, cbAttrID[i]), CB_ADDSTRING, 0, (LPARAM)cbAttrText[j]); } } for(int i = 0; i < _countof(cbULAttrID); i++) { for(int j = 0; j < _countof(cbULAttrText); j++) { SendMessageW(GetDlgItem(hDlg, cbULAttrID[i]), CB_ADDSTRING, 0, (LPARAM)cbULAttrText[j]); } } for(int i = 0; i < _countof(colCust); i++) { colCust[i] = RGB(0xFF, 0xFF, 0xFF); } LoadConfigDisplayAttr(no); for(int i = 0; i < _countof(displayAttr[no]); i++) { if(displayAttr[no][i].se) { CheckDlgButton(hDlg, displayAttrID[i][0], BST_CHECKED); DisplayAttrSeriesChecked(hDlg, displayAttrID[i][0]); } switch(displayAttr[no][i].da.crText.type) { case TF_CT_NONE: CheckDlgButton(hDlg, displayAttrID[i][1], BST_CHECKED); break; default: CheckDlgButton(hDlg, displayAttrID[i][2], BST_CHECKED); break; } switch(displayAttr[no][i].da.crBk.type) { case TF_CT_NONE: CheckDlgButton(hDlg, displayAttrID[i][4], BST_CHECKED); break; default: CheckDlgButton(hDlg, displayAttrID[i][5], BST_CHECKED); break; } SendMessageW(GetDlgItem(hDlg, displayAttrID[i][7]), CB_SETCURSEL, displayAttr[no][i].da.lsStyle, 0); CheckDlgButton(hDlg, displayAttrID[i][8], (displayAttr[no][i].da.fBoldLine ? BST_CHECKED : BST_UNCHECKED)); switch(displayAttr[no][i].da.crLine.type) { case TF_CT_NONE: CheckDlgButton(hDlg, displayAttrID[i][9], BST_CHECKED); break; default: CheckDlgButton(hDlg, displayAttrID[i][10], BST_CHECKED); break; } SendMessageW(GetDlgItem(hDlg, displayAttrID[i][12]), CB_SETCURSEL, displayAttr[no][i].da.bAttr, 0); } return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_CHECKBOX_SERIES_MARK: case IDC_CHECKBOX_SERIES_TEXT: case IDC_CHECKBOX_SERIES_OKURI: case IDC_CHECKBOX_SERIES_ANNOT: DisplayAttrSeriesChecked(hDlg, LOWORD(wParam)); //no break; case IDC_RADIO_FG_STD_MARK: case IDC_RADIO_FG_STD_TEXT: case IDC_RADIO_FG_STD_OKURI: case IDC_RADIO_FG_STD_ANNOT: case IDC_RADIO_FG_SEL_MARK: case IDC_RADIO_FG_SEL_TEXT: case IDC_RADIO_FG_SEL_OKURI: case IDC_RADIO_FG_SEL_ANNOT: case IDC_RADIO_BG_STD_MARK: case IDC_RADIO_BG_STD_TEXT: case IDC_RADIO_BG_STD_OKURI: case IDC_RADIO_BG_STD_ANNOT: case IDC_RADIO_BG_SEL_MARK: case IDC_RADIO_BG_SEL_TEXT: case IDC_RADIO_BG_SEL_OKURI: case IDC_RADIO_BG_SEL_ANNOT: case IDC_CHECKBOX_UL_BOLD_MARK: case IDC_CHECKBOX_UL_BOLD_TEXT: case IDC_CHECKBOX_UL_BOLD_OKURI: case IDC_CHECKBOX_UL_BOLD_ANNOT: case IDC_RADIO_UL_STD_MARK: case IDC_RADIO_UL_STD_TEXT: case IDC_RADIO_UL_STD_OKURI: case IDC_RADIO_UL_STD_ANNOT: case IDC_RADIO_UL_SEL_MARK: case IDC_RADIO_UL_SEL_TEXT: case IDC_RADIO_UL_SEL_OKURI: case IDC_RADIO_UL_SEL_ANNOT: PropSheet_Changed(GetParent(hDlg), hDlg); return TRUE; case IDC_COMBO_UL_ATTR_MARK: case IDC_COMBO_UL_ATTR_TEXT: case IDC_COMBO_UL_ATTR_OKURI: case IDC_COMBO_UL_ATTR_ANNOT: case IDC_COMBO_ATTR_MARK: case IDC_COMBO_ATTR_TEXT: case IDC_COMBO_ATTR_OKURI: case IDC_COMBO_ATTR_ANNOT: switch(HIWORD(wParam)) { case CBN_SELCHANGE: PropSheet_Changed(GetParent(hDlg), hDlg); return TRUE; default: break; } break; default: break; } break; case WM_LBUTTONDOWN: for(int i = 0; i < _countof(displayAttrColor[no]); i++) { for(int j = 0; j < _countof(displayAttrColor[no][i]); j++) { hwnd = GetDlgItem(hDlg, displayAttrColor[no][i][j].id); if(!IsWindowEnabled(hwnd)) { continue; } GetWindowRect(hwnd, &rect); pt.x = x = GET_X_LPARAM(lParam); pt.y = y = GET_Y_LPARAM(lParam); ClientToScreen(hDlg, &pt); if(rect.left <= pt.x && pt.x <= rect.right && rect.top <= pt.y && pt.y <= rect.bottom) { cc.lStructSize = sizeof(cc); cc.hwndOwner = hDlg; cc.hInstance = NULL; cc.rgbResult = *displayAttrColor[no][i][j].color; cc.lpCustColors = colCust; cc.Flags = CC_FULLOPEN | CC_RGBINIT; cc.lCustData = NULL; cc.lpfnHook = NULL; cc.lpTemplateName = NULL; if(ChooseColorW(&cc)) { DrawSelectColor(hDlg, displayAttrColor[no][i][j].id, cc.rgbResult); *displayAttrColor[no][i][j].color = cc.rgbResult; PropSheet_Changed(GetParent(hDlg), hDlg); return TRUE; } break; } } } break; case WM_PAINT: hdc = BeginPaint(hDlg, &ps); for(int i = 0; i < _countof(displayAttrColor[no]); i++) { for(int j = 0; j < _countof(displayAttrColor[no][i]) && displayAttr[no][i].key != NULL; j++) { DrawSelectColor(hDlg, displayAttrColor[no][i][j].id, *displayAttrColor[no][i][j].color); } } EndPaint(hDlg, &ps); return TRUE; case WM_NOTIFY: switch(((LPNMHDR)lParam)->code) { case PSN_APPLY: for(int i = 0; i < _countof(displayAttr[no]); i++) { displayAttr[no][i].se = (IsDlgButtonChecked(hDlg, displayAttrID[i][0]) == BST_CHECKED ? TRUE : FALSE); displayAttr[no][i].da.crText.type = (IsDlgButtonChecked(hDlg, displayAttrID[i][2]) == BST_CHECKED ? TF_CT_COLORREF : TF_CT_NONE); displayAttr[no][i].da.crBk.type = (IsDlgButtonChecked(hDlg, displayAttrID[i][5]) == BST_CHECKED ? TF_CT_COLORREF : TF_CT_NONE); displayAttr[no][i].da.lsStyle = (TF_DA_LINESTYLE)SendMessageW(GetDlgItem(hDlg, displayAttrID[i][7]), CB_GETCURSEL, 0, 0); displayAttr[no][i].da.fBoldLine = (IsDlgButtonChecked(hDlg, displayAttrID[i][8]) == BST_CHECKED ? TRUE : FALSE); displayAttr[no][i].da.crLine.type = (IsDlgButtonChecked(hDlg, displayAttrID[i][10]) == BST_CHECKED ? TF_CT_COLORREF : TF_CT_NONE); displayAttr[no][i].da.bAttr = (TF_DA_ATTR_INFO)SendMessageW(GetDlgItem(hDlg, displayAttrID[i][12]), CB_GETCURSEL, 0, 0); } SaveConfigDisplayAttr(no); return TRUE; default: break; } break; default: break; } return FALSE; }
bool mxWidget::isEnabled () const { return (IsWindowEnabled (d_this->d_hwnd) == TRUE); }
static void write_entries_to_window(HWND window, char *filename){ int num_of_entries, entry, row_num = 0; char numstr[6]; filetype type; LVITEMA row; FILE *fd; struct program_block program; HWND preview = GetDlgItem(window, IDC_PREVIEW); HWND text = GetDlgItem(window, IDC_FILE_TYPE); HWND c64name = GetDlgItem(window, IDC_C64_NAME); fd = fopen(filename, "rb"); if (fd == NULL) return; switch (type = detect_type(fd)) { case not_a_valid_file: EnableWindow(preview, FALSE); EnableWindow(c64name, FALSE); SetWindowTextA(text, ""); SetWindowTextA(c64name, ""); fclose(fd); return; case t64: { char message[1000]; char tape_name[25]; int num_of_used_entries; num_of_entries = get_total_entries(fd); num_of_used_entries = get_used_entries(fd); get_tape_name(tape_name, fd); _snprintf(message, 1000, "T64 file with %u total entr%s, %u used entr%s, name %s", num_of_entries, num_of_entries == 1 ? "y" : "ies", num_of_used_entries, num_of_used_entries == 1 ? "y" : "ies", tape_name); SetWindowTextA(text, message); EnableWindow(preview, num_of_used_entries > 1); } EnableWindow(c64name, FALSE); break; case p00: EnableWindow(preview, FALSE); num_of_entries = 1; SetWindowTextA(text, "P00 file"); EnableWindow(c64name, TRUE); break; case prg: EnableWindow(preview, FALSE); num_of_entries = 1; SetWindowTextA(text, "PRG file"); EnableWindow(c64name, TRUE); break; } for (entry = 1; entry <= num_of_entries; entry++) { if (get_entry(entry, fd, &program)) { row.mask = LVIF_TEXT; row.iItem = row_num++; row.iSubItem = 0; row.pszText = numstr; sprintf(numstr, "%u", entry); ListView_InsertItem(preview, &row); row.iSubItem = 1; row.pszText = program.info.name; ListView_SetItem(preview, &row); row.iSubItem = 2; row.pszText = numstr; sprintf(numstr, "%u", program.info.start); ListView_SetItem(preview, &row); row.iSubItem = 3; sprintf(numstr, "%u", program.info.end); ListView_SetItem(preview, &row); } } if (row_num == 1) { ListView_SetItemState(preview, 0, LVIS_SELECTED, LVIS_SELECTED); SetWindowTextA(c64name, program.info.name); } else { SetWindowTextA(c64name, ""); if (IsWindowEnabled(preview)) ListView_SetItemState(preview, 0, LVIS_FOCUSED, LVIS_FOCUSED); } fclose(fd); }
void CCJFlatComboBox::DrawCombo(DRAWSTATE eStyle, COLORREF clrTopLeft, COLORREF clrBottomRight) { CRect rcItem; GetClientRect(&rcItem); CDC* pDC = GetDC(); // Cover up dark 3D shadow. pDC->Draw3dRect(rcItem, clrTopLeft, clrBottomRight); rcItem.DeflateRect(1,1); if (!IsWindowEnabled()) { pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNHIGHLIGHT), ::GetSysColor(COLOR_BTNHIGHLIGHT)); } else { pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNFACE), ::GetSysColor(COLOR_BTNFACE)); } // Cover up dark 3D shadow on drop arrow. rcItem.DeflateRect(1,1); rcItem.left = rcItem.right-::GetSystemMetrics(SM_CXHTHUMB);; pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNFACE), ::GetSysColor(COLOR_BTNFACE)); // Cover up normal 3D shadow on drop arrow. rcItem.DeflateRect(1,1); pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNFACE), ::GetSysColor(COLOR_BTNFACE)); if (!IsWindowEnabled()) { return; } switch (eStyle) { case FC_DRAWNORMAL: rcItem.top -= 1; rcItem.bottom += 1; pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNHIGHLIGHT), ::GetSysColor(COLOR_BTNHIGHLIGHT)); rcItem.left -= 1; pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNHIGHLIGHT), ::GetSysColor(COLOR_BTNHIGHLIGHT)); break; case FC_DRAWRAISED: rcItem.top -= 1; rcItem.bottom += 1; pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNHIGHLIGHT), ::GetSysColor(COLOR_BTNSHADOW)); break; case FC_DRAWPRESSD: rcItem.top -= 1; rcItem.bottom += 1; rcItem.OffsetRect(1,1); pDC->Draw3dRect(rcItem, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHIGHLIGHT)); break; } ReleaseDC(pDC); }
static INT_PTR CALLBACK BackgroundDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { LVCOLUMN lvc; RECT rc; GetClientRect(GetDlgItem(hwndDlg, IDC_PAST), &rc); rc.right-=GetSystemMetrics(SM_CXVSCROLL); lvc.mask = LVCF_WIDTH; lvc.cx = rc.right/3; ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PAST), 0, &lvc); ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_INTERESTS), 0, &lvc); lvc.cx = rc.right-rc.right/3; ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PAST), 1, &lvc); ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_INTERESTS), 1, &lvc); } ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg, IDC_PAST), LVS_EX_LABELTIP, LVS_EX_LABELTIP); ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg, IDC_INTERESTS), LVS_EX_LABELTIP, LVS_EX_LABELTIP); break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED) { LVITEM lvi; int i; char idstr[33]; DBVARIANT dbv, dbvText; HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam; if (hContact != NULL) { char *szProto = GetContactProto(hContact); if (szProto == NULL) break; bool proto_service = (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC) == PF4_INFOSETTINGSVC; SetValue(hwndDlg, IDC_WEBPAGE, hContact, szProto, "Homepage", SVS_ZEROISUNSPEC); //past ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_PAST)); lvi.mask = LVIF_TEXT; lvi.iSubItem = 0; lvi.iItem = 0; for (i=0;;i++) { mir_snprintf(idstr, SIZEOF(idstr), "Past%d", i); if ((proto_service && Proto_GetContactInfoSetting(hContact, szProto, szProto, idstr, &dbv, DBVT_TCHAR)) || ( !proto_service && db_get_ts(hContact, szProto, idstr, &dbv))) break; mir_snprintf(idstr, SIZEOF(idstr), "Past%dText", i); if (db_get_ts(hContact, szProto, idstr, &dbvText)) {if (proto_service) Proto_FreeInfoVariant(&dbv); else db_free(&dbv); break;} lvi.pszText = dbv.ptszVal; ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PAST), &lvi); ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PAST), lvi.iItem, 1, dbvText.ptszVal); db_free(&dbvText); if (proto_service) Proto_FreeInfoVariant(&dbv); else db_free(&dbv); lvi.iItem++; } for (i=0;;i++) { mir_snprintf(idstr, SIZEOF(idstr), "Affiliation%d", i); if ((proto_service && Proto_GetContactInfoSetting(hContact, szProto, szProto, idstr, &dbv, DBVT_TCHAR)) || ( !proto_service && db_get_ts(hContact, szProto, idstr, &dbv))) break; mir_snprintf(idstr, SIZEOF(idstr), "Affiliation%dText", i); if (db_get_ts(hContact, szProto, idstr, &dbvText)) {if (proto_service) Proto_FreeInfoVariant(&dbv); else db_free(&dbv); break;} lvi.pszText = dbv.ptszVal; ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PAST), &lvi); ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PAST), lvi.iItem, 1, dbvText.ptszVal); db_free(&dbvText); if (proto_service) Proto_FreeInfoVariant(&dbv); else db_free(&dbv); lvi.iItem++; } ResizeColumns(GetDlgItem(hwndDlg, IDC_PAST)); //interests ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_INTERESTS)); lvi.mask = LVIF_TEXT; lvi.iSubItem = 0; lvi.iItem = 0; for (i=0;;i++) { mir_snprintf(idstr, SIZEOF(idstr), "Interest%dCat", i); if ((proto_service && Proto_GetContactInfoSetting(hContact, szProto, szProto, idstr, &dbv, DBVT_TCHAR)) || ( !proto_service && db_get_ts(hContact, szProto, idstr, &dbv))) break; mir_snprintf(idstr, SIZEOF(idstr), "Interest%dText", i); if (db_get_ts(hContact, szProto, idstr, &dbvText)) {if (proto_service) Proto_FreeInfoVariant(&dbv); else db_free(&dbv); break;} lvi.pszText = dbv.ptszVal; ListView_InsertItem(GetDlgItem(hwndDlg, IDC_INTERESTS), &lvi); ListView_SetItemText(GetDlgItem(hwndDlg, IDC_INTERESTS), lvi.iItem, 1, dbvText.ptszVal); db_free(&dbvText); if (proto_service) Proto_FreeInfoVariant(&dbv); else db_free(&dbv); lvi.iItem++; } ResizeColumns(GetDlgItem(hwndDlg, IDC_INTERESTS)); } } break; } break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDCANCEL: SendMessage(GetParent(hwndDlg), msg, wParam, lParam); break; case IDC_WEBPAGE: if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_WEBPAGE))) { char szPage[256]; GetDlgItemTextA(hwndDlg, IDC_WEBPAGE, szPage, SIZEOF(szPage)); CallService(MS_UTILS_OPENURL, 1, (LPARAM)szPage); } break; } break; } return FALSE; }
void CBtnRoundImg::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC dc; dc.Attach(lpDrawItemStruct->hDC); //°´Å¥¿Ø¼þDC COLORREF clrBK = RGB(255,255,255); switch(m_nCtrlState) { case CTRL_NOFOCUS: clrBK = m_clrBKUnfocus; break; case CTRL_FOCUS: clrBK = m_clrBKFocus; break; case CTRL_SELECTED: clrBK = m_clrBKSelected; break; default: break; } if (IsWindowEnabled()==FALSE) { clrBK = m_clrBKDisable; } //draw background CRect rect(lpDrawItemStruct->rcItem); //dc.FillSolidRect(&rect,clrBK); DrawRoundRect(dc, 5,rect,clrBK); //draw image if (m_strPngPath != _T("")) { Gdiplus::Image imageBtn(m_strPngPath); if (imageBtn.GetLastStatus() != Ok) { ASSERT(FALSE); } ; HRGN hRgnOld = (HRGN)::SelectObject(lpDrawItemStruct->hDC, m_hRgnBtn); Gdiplus::Graphics * pGrp = Graphics::FromHDC(lpDrawItemStruct->hDC); pGrp->Clear(Color::White); CRect rectBtn; GetClientRect(&rectBtn); int startX = (rectBtn.Width() - imageBtn.GetWidth())/2; int startY = (rectBtn.Height() - imageBtn.GetHeight())/2; startX = 0; startY = 0; if (lpDrawItemStruct->itemState & ODS_SELECTED) //Ñ¡ÖÐ״̬£¬Í¼Æ¬Æ«ÒÆÒ»¸öÏñËØ { pGrp->DrawImage(&imageBtn, startX+1, startY+1, startX+imageBtn.GetWidth(), startY+imageBtn.GetHeight()); } else //ĬÈÏ״̬ { pGrp->DrawImage(&imageBtn, startX, startY, startX+imageBtn.GetWidth(), startY+imageBtn.GetHeight()); } delete pGrp; pGrp = NULL; ::SelectObject(lpDrawItemStruct->hDC, hRgnOld); } CFont* pOldFont; if (m_pFont) { pOldFont = dc.SelectObject(m_pFont); } COLORREF clrOld = dc.SetTextColor(m_clrFont); CString strText; GetWindowText(strText); if (strText != _T("")) { int test = 1; } int oldMode = dc.SetBkMode(TRANSPARENT); dc.DrawText(strText, -1, &lpDrawItemStruct->rcItem, DT_CENTER|DT_SINGLELINE|DT_VCENTER); dc.SetBkMode(oldMode); dc.SetTextColor(clrOld); if (m_pFont) { dc.SelectObject(pOldFont); } dc.Detach(); }
INT_PTR CALLBACK WepWindowsPageProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { PWINDOWS_CONTEXT context; LPPROPSHEETPAGE propSheetPage; PPH_PROCESS_PROPPAGECONTEXT propPageContext; PPH_PROCESS_ITEM processItem; if (PhPropPageDlgProcHeader(hwndDlg, uMsg, lParam, &propSheetPage, &propPageContext, &processItem)) { context = propPageContext->Context; } else { return FALSE; } switch (uMsg) { case WM_INITDIALOG: { context->TreeNewHandle = GetDlgItem(hwndDlg, IDC_LIST); context->SearchBoxHandle = GetDlgItem(hwndDlg, IDC_SEARCHEDIT); PhCreateSearchControl(hwndDlg, context->SearchBoxHandle, L"Search Windows (Ctrl+K)"); WeInitializeWindowTree(hwndDlg, context->TreeNewHandle, &context->TreeContext); PhRegisterDialog(hwndDlg); PhInitializeLayoutManager(&context->LayoutManager, hwndDlg); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_SEARCHEDIT), NULL, PH_ANCHOR_TOP | PH_ANCHOR_RIGHT); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_LIST), NULL, PH_ANCHOR_ALL); WepRefreshWindows(context); } break; case WM_SHOWWINDOW: { if (PhBeginPropPageLayout(hwndDlg, propPageContext)) PhEndPropPageLayout(hwndDlg, propPageContext); } break; case WM_DESTROY: { PhDeleteLayoutManager(&context->LayoutManager); PhUnregisterDialog(hwndDlg); WeDeleteWindowTree(&context->TreeContext); WepDeleteWindowSelector(&context->Selector); PhFree(context); } break; case WM_COMMAND: { switch (GET_WM_COMMAND_CMD(wParam, lParam)) { case EN_CHANGE: { PPH_STRING newSearchboxText; if (GET_WM_COMMAND_HWND(wParam, lParam) != context->SearchBoxHandle) break; newSearchboxText = PH_AUTO(PhGetWindowText(context->SearchBoxHandle)); if (!PhEqualString(context->TreeContext.SearchboxText, newSearchboxText, FALSE)) { PhSwapReference(&context->TreeContext.SearchboxText, newSearchboxText); if (!PhIsNullOrEmptyString(context->TreeContext.SearchboxText)) WeExpandAllWindowNodes(&context->TreeContext, TRUE); PhApplyTreeNewFilters(&context->TreeContext.FilterSupport); TreeNew_NodesStructured(context->TreeNewHandle); // PhInvokeCallback(&SearchChangedEvent, SearchboxText); } } break; } switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_REFRESH: WepRefreshWindows(context); break; case ID_SHOWCONTEXTMENU: { PPH_TREENEW_CONTEXT_MENU contextMenuEvent = (PPH_TREENEW_CONTEXT_MENU)lParam; PWE_WINDOW_NODE *windows; ULONG numberOfWindows; PPH_EMENU menu; PPH_EMENU selectedItem; WeGetSelectedWindowNodes( &context->TreeContext, &windows, &numberOfWindows ); if (numberOfWindows != 0) { menu = PhCreateEMenu(); PhLoadResourceEMenuItem(menu, PluginInstance->DllBase, MAKEINTRESOURCE(IDR_WINDOW), 0); PhInsertCopyCellEMenuItem(menu, ID_WINDOW_COPY, context->TreeNewHandle, contextMenuEvent->Column); PhSetFlagsEMenuItem(menu, ID_WINDOW_PROPERTIES, PH_EMENU_DEFAULT, PH_EMENU_DEFAULT); if (numberOfWindows == 1) { WINDOWPLACEMENT placement = { sizeof(placement) }; BYTE alpha; ULONG flags; ULONG i; ULONG id; // State GetWindowPlacement(windows[0]->WindowHandle, &placement); if (placement.showCmd == SW_MINIMIZE) PhSetFlagsEMenuItem(menu, ID_WINDOW_MINIMIZE, PH_EMENU_DISABLED, PH_EMENU_DISABLED); else if (placement.showCmd == SW_MAXIMIZE) PhSetFlagsEMenuItem(menu, ID_WINDOW_MAXIMIZE, PH_EMENU_DISABLED, PH_EMENU_DISABLED); else if (placement.showCmd == SW_NORMAL) PhSetFlagsEMenuItem(menu, ID_WINDOW_RESTORE, PH_EMENU_DISABLED, PH_EMENU_DISABLED); // Visible PhSetFlagsEMenuItem(menu, ID_WINDOW_VISIBLE, PH_EMENU_CHECKED, (GetWindowLong(windows[0]->WindowHandle, GWL_STYLE) & WS_VISIBLE) ? PH_EMENU_CHECKED : 0); // Enabled PhSetFlagsEMenuItem(menu, ID_WINDOW_ENABLED, PH_EMENU_CHECKED, !(GetWindowLong(windows[0]->WindowHandle, GWL_STYLE) & WS_DISABLED) ? PH_EMENU_CHECKED : 0); // Always on Top PhSetFlagsEMenuItem(menu, ID_WINDOW_ALWAYSONTOP, PH_EMENU_CHECKED, (GetWindowLong(windows[0]->WindowHandle, GWL_EXSTYLE) & WS_EX_TOPMOST) ? PH_EMENU_CHECKED : 0); // Opacity if (GetLayeredWindowAttributes(windows[0]->WindowHandle, NULL, &alpha, &flags)) { if (!(flags & LWA_ALPHA)) alpha = 255; } else { alpha = 255; } if (alpha == 255) { id = ID_OPACITY_OPAQUE; } else { id = 0; // Due to integer division, we cannot use simple arithmetic to calculate which menu item to check. for (i = 0; i < 10; i++) { if (alpha == (BYTE)(255 * (i + 1) / 10)) { id = ID_OPACITY_10 + i; break; } } } if (id != 0) { PhSetFlagsEMenuItem(menu, id, PH_EMENU_CHECKED | PH_EMENU_RADIOCHECK, PH_EMENU_CHECKED | PH_EMENU_RADIOCHECK); } } else { PhSetFlagsAllEMenuItems(menu, PH_EMENU_DISABLED, PH_EMENU_DISABLED); PhSetFlagsEMenuItem(menu, ID_WINDOW_COPY, PH_EMENU_DISABLED, 0); } selectedItem = PhShowEMenu( menu, hwndDlg, PH_EMENU_SHOW_SEND_COMMAND | PH_EMENU_SHOW_LEFTRIGHT, PH_ALIGN_LEFT | PH_ALIGN_TOP, contextMenuEvent->Location.x, contextMenuEvent->Location.y ); if (selectedItem && selectedItem->Id != -1) { BOOLEAN handled = FALSE; handled = PhHandleCopyCellEMenuItem(selectedItem); } PhDestroyEMenu(menu); } } break; case ID_WINDOW_BRINGTOFRONT: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { WINDOWPLACEMENT placement = { sizeof(placement) }; GetWindowPlacement(selectedNode->WindowHandle, &placement); if (placement.showCmd == SW_MINIMIZE) ShowWindowAsync(selectedNode->WindowHandle, SW_RESTORE); else SetForegroundWindow(selectedNode->WindowHandle); } } break; case ID_WINDOW_RESTORE: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { ShowWindowAsync(selectedNode->WindowHandle, SW_RESTORE); } } break; case ID_WINDOW_MINIMIZE: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { ShowWindowAsync(selectedNode->WindowHandle, SW_MINIMIZE); } } break; case ID_WINDOW_MAXIMIZE: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { ShowWindowAsync(selectedNode->WindowHandle, SW_MAXIMIZE); } } break; case ID_WINDOW_CLOSE: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { PostMessage(selectedNode->WindowHandle, WM_CLOSE, 0, 0); } } break; case ID_WINDOW_VISIBLE: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { if (IsWindowVisible(selectedNode->WindowHandle)) { selectedNode->WindowVisible = FALSE; ShowWindowAsync(selectedNode->WindowHandle, SW_HIDE); } else { selectedNode->WindowVisible = TRUE; ShowWindowAsync(selectedNode->WindowHandle, SW_SHOW); } PhInvalidateTreeNewNode(&selectedNode->Node, TN_CACHE_COLOR); TreeNew_InvalidateNode(context->TreeNewHandle, &selectedNode->Node); } } break; case ID_WINDOW_ENABLED: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { EnableWindow(selectedNode->WindowHandle, !IsWindowEnabled(selectedNode->WindowHandle)); } } break; case ID_WINDOW_ALWAYSONTOP: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { LOGICAL topMost; topMost = GetWindowLong(selectedNode->WindowHandle, GWL_EXSTYLE) & WS_EX_TOPMOST; SetWindowPos(selectedNode->WindowHandle, topMost ? HWND_NOTOPMOST : HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); } } break; case ID_OPACITY_10: case ID_OPACITY_20: case ID_OPACITY_30: case ID_OPACITY_40: case ID_OPACITY_50: case ID_OPACITY_60: case ID_OPACITY_70: case ID_OPACITY_80: case ID_OPACITY_90: case ID_OPACITY_OPAQUE: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { ULONG opacity; opacity = ((ULONG)LOWORD(wParam) - ID_OPACITY_10) + 1; if (opacity == 10) { // Remove the WS_EX_LAYERED bit since it is not needed. PhSetWindowExStyle(selectedNode->WindowHandle, WS_EX_LAYERED, 0); RedrawWindow(selectedNode->WindowHandle, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); } else { // Add the WS_EX_LAYERED bit so opacity will work. PhSetWindowExStyle(selectedNode->WindowHandle, WS_EX_LAYERED, WS_EX_LAYERED); SetLayeredWindowAttributes(selectedNode->WindowHandle, 0, (BYTE)(255 * opacity / 10), LWA_ALPHA); } } } break; case ID_WINDOW_HIGHLIGHT: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { if (context->HighlightingWindow) { if (context->HighlightingWindowCount & 1) WeInvertWindowBorder(context->HighlightingWindow); } context->HighlightingWindow = selectedNode->WindowHandle; context->HighlightingWindowCount = 10; SetTimer(hwndDlg, 9, 100, NULL); } } break; case ID_WINDOW_GOTOTHREAD: { PWE_WINDOW_NODE selectedNode; PPH_PROCESS_ITEM processItem; PPH_PROCESS_PROPCONTEXT propContext; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) { if (processItem = PhReferenceProcessItem(selectedNode->ClientId.UniqueProcess)) { if (propContext = PhCreateProcessPropContext(WE_PhMainWndHandle, processItem)) { PhSetSelectThreadIdProcessPropContext(propContext, selectedNode->ClientId.UniqueThread); PhShowProcessProperties(propContext); PhDereferenceObject(propContext); } PhDereferenceObject(processItem); } else { PhShowError(hwndDlg, L"The process does not exist."); } } } break; case ID_WINDOW_PROPERTIES: { PWE_WINDOW_NODE selectedNode; if (selectedNode = WeGetSelectedWindowNode(&context->TreeContext)) WeShowWindowProperties(hwndDlg, selectedNode->WindowHandle); } break; case ID_WINDOW_COPY: { PPH_STRING text; text = PhGetTreeNewText(context->TreeNewHandle, 0); PhSetClipboardString(hwndDlg, &text->sr); PhDereferenceObject(text); } break; } } break; case WM_TIMER: { switch (wParam) { case 9: { WeInvertWindowBorder(context->HighlightingWindow); if (--context->HighlightingWindowCount == 0) KillTimer(hwndDlg, 9); } break; } } break; case WM_SIZE: PhLayoutManagerLayout(&context->LayoutManager); break; case WM_NOTIFY: { LPNMHDR header = (LPNMHDR)lParam; switch (header->code) { case PSN_QUERYINITIALFOCUS: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LPARAM)GetDlgItem(hwndDlg, IDC_REFRESH)); return TRUE; } } break; } return FALSE; }
void _run_wizard_action( HWND hwnd, _wz_sheets *sheets, _dnode *node ) { BOOL set_loader = (BOOL) SendMessage( GetDlgItem(sheets[WPAGE_ENC_BOOT].hwnd, IDC_COMBO_BOOT_INST), CB_GETCURSEL, 0, 0 ); wchar_t *fs_name = fs_names[SendMessage( GetDlgItem(sheets[WPAGE_ENC_FRMT].hwnd, IDC_COMBO_FS_LIST), CB_GETCURSEL, 0, 0 )]; int kb_layout = _get_combo_val( GetDlgItem(sheets[WPAGE_ENC_PASS].hwnd, IDC_COMBO_KBLAYOUT), kb_layouts ); BOOL q_format = _get_check( sheets[WPAGE_ENC_FRMT].hwnd, IDC_CHECK_QUICK_FORMAT ); int is_small = ( IsWindowEnabled( GetDlgItem( sheets[WPAGE_ENC_CONF].hwnd, IDC_COMBO_ALGORT ) ) ? FALSE : TRUE ); crypt_info crypt; dc_pass *pass = NULL; crypt.cipher_id = _get_combo_val( GetDlgItem(sheets[WPAGE_ENC_CONF].hwnd, IDC_COMBO_ALGORT), cipher_names ); crypt.wp_mode = _get_combo_val( GetDlgItem(sheets[WPAGE_ENC_CONF].hwnd, IDC_COMBO_PASSES), wipe_modes ); node->dlg.rlt = ST_ERROR; switch ( node->dlg.act_type ) { /////////////////////////////////////////////////////////////// case ACT_REENCRYPT : /////////////////////////////////////////////////////////////// /////// REENCRYPT VOLUME ////////////////////////////////////// { wchar_t mnt_point[MAX_PATH] = { 0 }; wchar_t vol[MAX_PATH]; dlgpass dlg_info = { node, NULL, NULL, mnt_point }; ShowWindow(hwnd, FALSE); if ( _dlg_get_pass(__dlg, &dlg_info) == ST_OK ) { node->mnt.info.status.crypt.wp_mode = crypt.wp_mode; node->dlg.rlt = dc_start_re_encrypt( node->mnt.info.device, dlg_info.pass, &crypt ); secure_free( dlg_info.pass ); if ( mnt_point[0] != 0 ) { _snwprintf( vol, sizeof_w(vol), L"%s\\", node->mnt.info.w32_device ); _set_trailing_slash( mnt_point ); if ( SetVolumeMountPoint(mnt_point, vol) == 0 ) { __error_s( __dlg, L"Error when adding mount point", node->dlg.rlt ); } } } else { node->dlg.rlt = ST_CANCEL; } } break; /////////////////////////////////////////////////////////////// case ACT_ENCRYPT_CD : /////////////////////////////////////////////////////////////// /////// ENCRYPT CD //////////////////////////////////////////// { _init_speed_stat( &node->dlg.iso.speed ); pass = _get_pass_keyfiles( sheets[WPAGE_ENC_PASS].hwnd, IDE_PASS, IDC_USE_KEYFILES, KEYLIST_CURRENT ); if ( pass ) { DWORD resume; { wchar_t s_src_path[MAX_PATH] = { 0 }; wchar_t s_dst_path[MAX_PATH] = { 0 }; GetWindowText( GetDlgItem(sheets[WPAGE_ENC_ISO].hwnd, IDE_ISO_SRC_PATH), s_src_path, sizeof_w(s_src_path) ); GetWindowText( GetDlgItem(sheets[WPAGE_ENC_ISO].hwnd, IDE_ISO_DST_PATH), s_dst_path, sizeof_w(s_dst_path) ); wcscpy( node->dlg.iso.s_iso_src, s_src_path ); wcscpy( node->dlg.iso.s_iso_dst, s_dst_path ); node->dlg.iso.cipher_id = crypt.cipher_id; node->dlg.iso.pass = pass; } node->dlg.iso.h_thread = CreateThread( NULL, 0, _thread_enc_iso_proc, pv(node), CREATE_SUSPENDED, NULL ); SetThreadPriority( node->dlg.iso.h_thread, THREAD_PRIORITY_LOWEST ); resume = ResumeThread( node->dlg.iso.h_thread ); if ( !node->dlg.iso.h_thread || resume == (DWORD) -1 ) { __error_s( hwnd, L"Error create thread", -1 ); secure_free(pass); } } } break; /////////////////////////////////////////////////////////////// default : /////////////////////////////////////////////////////////////// { node->mnt.info.status.crypt.wp_mode = crypt.wp_mode; node->dlg.rlt = ST_OK; if ( sheets[WPAGE_ENC_BOOT].show ) { if ( set_loader ) { node->dlg.rlt = _set_boot_loader( hwnd, -1, is_small ); } } if ( ( node->dlg.rlt == ST_OK ) && ( IsWindowEnabled( GetDlgItem( sheets[WPAGE_ENC_PASS].hwnd, IDC_LAYOUTS_LIST ) ) ) ) { node->dlg.rlt = _update_layout( node, kb_layout, NULL ); } if ( node->dlg.rlt == ST_OK ) { switch ( node->dlg.act_type ) { /////////////////////////////////////////////////////////////// case ACT_ENCRYPT : /////////////////////////////////////////////////////////////// /////// ENCRYPT VOLUME //////////////////////////////////////// { pass = _get_pass_keyfiles( sheets[WPAGE_ENC_PASS].hwnd, IDE_PASS, IDC_USE_KEYFILES, KEYLIST_CURRENT ); if ( pass != NULL ) { node->dlg.rlt = dc_start_encrypt( node->mnt.info.device, pass, &crypt ); secure_free(pass); } } break; /////////////////////////////////////////////////////////////// case ACT_FORMAT : /////////////////////////////////////////////////////////////// /////// FORMAT VOLUME ///////////////////////////////////////// { pass = _get_pass_keyfiles( sheets[WPAGE_ENC_PASS].hwnd, IDE_PASS, IDC_USE_KEYFILES, KEYLIST_CURRENT ); if ( pass ) { node->dlg.rlt = dc_start_format( node->mnt.info.device, pass, &crypt ); secure_free(pass); } } break; } } } } node->dlg.q_format = q_format; node->dlg.fs_name = fs_name; if ( !node->dlg.iso.h_thread ) { EndDialog( hwnd, 0 ); } }
static void DisplayReplayProperties(HWND hDlg, bool bClear) { UINT8 movie_header[INP_HEADER_SIZE]; static bool bReadOnlyStatus = true; UINT32 total_frames; UINT32 rerecord_count; // save status of read only checkbox if (IsWindowEnabled(GetDlgItem(hDlg, IDC_READONLY))) { bReadOnlyStatus = (BST_CHECKED == SendDlgItemMessage(hDlg, IDC_READONLY, BM_GETCHECK, 0, 0)); } // set default values SetDlgItemTextA(hDlg, IDC_LENGTH, ""); SetDlgItemTextA(hDlg, IDC_FRAMES, ""); SetDlgItemTextA(hDlg, IDC_UNDO, ""); // SetDlgItemTextA(hDlg, IDC_METADATA, ""); // SetDlgItemTextA(hDlg, IDC_REPLAYRESET, ""); EnableWindow(GetDlgItem(hDlg, IDC_READONLY), FALSE); SendDlgItemMessage(hDlg, IDC_READONLY, BM_SETCHECK, BST_UNCHECKED, 0); EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); if(bClear) { return; } long lCount = SendDlgItemMessage(hDlg, IDC_CHOOSE_LIST, CB_GETCOUNT, 0, 0); long lIndex = SendDlgItemMessage(hDlg, IDC_CHOOSE_LIST, CB_GETCURSEL, 0, 0); if (lIndex == CB_ERR) { return; } if (lIndex == lCount - 1) { // Last item is "Browse..." EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); // Browse is selectable return; } long lStringLength = SendDlgItemMessage(hDlg, IDC_CHOOSE_LIST, CB_GETLBTEXTLEN, (WPARAM)lIndex, 0); if(lStringLength + 1 > _MAX_PATH) { return; } SendDlgItemMessage(hDlg, IDC_CHOOSE_LIST, CB_GETLBTEXT, (WPARAM)lIndex, (LPARAM)szChoice); // check relative path GetRecordingPath(szChoice); // open the playback file FILE* fd = _wfopen(szChoice, L"r+b"); if (!fd) { return; } if (fread(movie_header, 1, sizeof(movie_header), fd) != sizeof(movie_header)) return; if (memcmp(movie_header, "MAMETAS\0", 8) != 0) return; if (movie_header[0x08] != INP_HEADER_MAJVERSION) return; if (_waccess(szChoice, W_OK)) { SendDlgItemMessage(hDlg, IDC_READONLY, BM_SETCHECK, BST_CHECKED, 0); } else { EnableWindow(GetDlgItem(hDlg, IDC_READONLY), TRUE); SendDlgItemMessage(hDlg, IDC_READONLY, BM_SETCHECK, BST_CHECKED, 0); //read-only by default } /* fread(&movieFlags, 1, 1, fd); // Read identifier if (movieFlags&MOVIE_FLAG_FROM_POWERON) // starts from reset bStartFromReset = 1; else bStartFromReset = 0; if (!bStartFromReset) { memset(ReadHeader, 0, 4); fread(ReadHeader, 1, 4, fd); // Read identifier if (memcmp(ReadHeader, szSavestateHeader, 4)) { // Not the chunk type fclose(fd); return; } */ fread(&total_frames, 1, sizeof(total_frames), fd); fread(&rerecord_count, 1, sizeof(rerecord_count), fd); /* // read metadata fseek(fd, nChunkDataPosition + nChunkSize, SEEK_SET); memset(ReadHeader, 0, 4); fread(ReadHeader, 1, 4, fd); // Read identifier if (memcmp(ReadHeader, szMetadataHeader, 4) == 0) { nChunkSize = 0; fread(&nChunkSize, 1, 4, fd); int nMetaLen = nChunkSize >> 1; if(nMetaLen >= MAX_METADATA) { nMetaLen = MAX_METADATA-1; } local_metadata = (wchar_t*)malloc((nMetaLen+1)*sizeof(wchar_t)); int i; for(i=0; i<nMetaLen; ++i) { wchar_t c = 0; c |= fgetc(fd) & 0xff; c |= (fgetc(fd) & 0xff) << 8; local_metadata[i] = c; } local_metadata[i] = L'\0'; } */ // done reading file fclose(fd); // file exists and is the corrent format, // so enable the "Ok" button EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); // turn nFrames into a length string int nFPS = 60; // TODO: where to get FPS for each driver? int nSeconds = (total_frames * 100 + (nFPS>>1)) / nFPS; int nMinutes = nSeconds / 60; int nHours = nSeconds / 3600; // write strings to dialog char szFramesString[32]; char szLengthString[32]; char szUndoCountString[32]; sprintf(szFramesString, "%d", total_frames); sprintf(szLengthString, "%02d:%02d:%02d", nHours, nMinutes % 60, nSeconds % 60); sprintf(szUndoCountString, "%d", rerecord_count); SetDlgItemTextA(hDlg, IDC_LENGTH, szLengthString); SetDlgItemTextA(hDlg, IDC_FRAMES, szFramesString); SetDlgItemTextA(hDlg, IDC_UNDO, szUndoCountString); // SetDlgItemTextW(hDlg, IDC_METADATA, local_metadata); // if (bStartFromReset) // SetDlgItemTextA(hDlg, IDC_REPLAYRESET, "Power-On"); // else // SetDlgItemTextA(hDlg, IDC_REPLAYRESET, "Savestate"); // free(local_metadata); }
void CRRECRuler::OnPaint() /* ============================================================ Function : CRRECRuler::OnPaint Description : Handles the "WM_PAINT" message from Windows. Draws the ruler to a memory "CDC" that is blitted to the screen (double buffering) Access : Protected Return : void Parameters : none Usage : Called from MFC ============================================================*/ { CPaintDC mainDC(this); // Set up data int pos = GetParent()->SendMessage( urm_GETSCROLLPOS ); CRect rect; GetClientRect( rect ); // Create off-screen canvas CDC dc; CBitmap bmp; bmp.CreateCompatibleBitmap( &mainDC, rect.Width(), rect.Height() ); dc.CreateCompatibleDC( &mainDC ); CBitmap* oldbmp = dc.SelectObject( &bmp ); dc.FillSolidRect( rect, m_crBack); // Set up canvas BOOL bEnabled = IsWindowEnabled(); COLORREF crBack = GetSysColor(bEnabled ? COLOR_WINDOW : COLOR_3DFACE); COLORREF crText = GetSysColor(bEnabled ? COLOR_WINDOWTEXT : COLOR_3DSHADOW); // Set up data for the inner ruler window CRect winRect( rect ); winRect.top += 3; winRect.bottom -= 5; winRect.right -= 3; winRect.left += m_margin - 2; if (bEnabled) // else same as dialog bk color dc.FillSolidRect( winRect, GetSysColor(COLOR_WINDOW)); // Frame the inside CThemed th(this, _T("EDIT")); if (th.AreControlsThemed()) { winRect.InflateRect(0, 1, 0, 1); int nState = ETS_NORMAL; if (!bEnabled) nState = ETS_DISABLED; else if (GetStyle() & ES_READONLY) nState = ETS_READONLY; th.DrawBackground(&dc, EP_EDITTEXT, nState, winRect); // get the theme bk color for the text crBack = th.GetThemeColor(EP_EDITTEXT, nState, TMT_FILLCOLOR); } else { dc.Draw3dRect(winRect, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DHILIGHT)); winRect.DeflateRect(1, 1); dc.Draw3dRect(winRect, ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DFACE)); winRect.InflateRect(1, 1); } int midpoint = winRect.top + ( winRect.Height() / 2 ); int leftmarg = winRect.left + 2 - pos; int width = winRect.Height(); int t; // Print the values in the ruler scale dc.SetBkColor(crBack); dc.SetTextColor(crText); dc.SelectStockObject( BLACK_PEN ); dc.SelectStockObject( DEFAULT_GUI_FONT ); if( m_mode == MODE_INCH ) { int inch4 = ( int ) ( ( double ) m_physicalInch / 4.0 +.5 ); int inch8 = ( int ) ( ( double ) m_physicalInch / 8.0 +.5 ); // Drawing scale markers for( t = ( leftmarg + ( int ) ( inch8 +.5 ) ) ; t < rect.right - m_margin ; t += ( int ) ( inch8 + .5 ) ) { dc.MoveTo( t, midpoint - 1 ); dc.LineTo( t, midpoint + 1 ); } for( t = leftmarg + inch4 ; t < rect.right - m_margin ; t += inch4 ) { dc.MoveTo( t, midpoint - 3 ); dc.LineTo( t, midpoint + 3 ); } CRect rectInch; CString counter; int count = 1; // Drawing numbers for( t = leftmarg + m_physicalInch ; t < rect.right - m_margin ; t += m_physicalInch ) { rectInch.SetRect( t - width / 2, winRect.top + 2, t + width / 2, winRect.bottom - 2 ); counter.Format( _T( "%i" ), count ); dc.DrawText( counter, rectInch, DT_SINGLELINE | DT_CENTER | DT_VCENTER ); count++; } } else { int cm = ( int ) ( ( double ) m_physicalInch / 2.54 + .5 ); int cm2 = ( int ) ( ( double ) cm / 2.0 ); // Drawing scale markers for( t = leftmarg + cm2 ; t < rect.right - m_margin ; t += cm2 ) { dc.MoveTo( t, midpoint - 1 ); dc.LineTo( t, midpoint + 2 ); } CRect rectNum; CString counter; int count = 1; // Drawing numbers for( t = leftmarg + cm ; t < rect.right - m_margin ; t += cm ) { rectNum.SetRect( t - width / 2, winRect.top + 2, t + width / 2, winRect.bottom - 2 ); counter.Format( _T( "%i" ), count ); dc.DrawText( counter, rectNum, DT_SINGLELINE | DT_CENTER | DT_VCENTER ); count++; } } // Draw tab markers int max = m_tabs.GetSize(); for( t = 0 ; t < max ; t++ ) { int x = ( leftmarg + m_tabs[ t ] - 2 ); if( x > winRect.left && x + 3 < winRect.right ) { dc.MoveTo( x, midpoint + 5 ); dc.LineTo( x + 6, midpoint + 5 ); dc.MoveTo( x, midpoint + 6 ); dc.LineTo( x + 6, midpoint + 6 ); dc.MoveTo( x + 2, midpoint + 7 ); dc.LineTo( x + 2, midpoint + 10 ); dc.MoveTo( x + 3, midpoint + 7 ); dc.LineTo( x + 3, midpoint + 10 ); } } //... and out to screen mainDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY ); dc.SelectObject( oldbmp ); }
void CRoundSliderCtrl::OnPaint() { const int nMin = GetRangeMin(); const int nMax = GetRangeMax()+1; const bool bDisabled = !IsWindowEnabled(); CPaintDC dc(this); // device context for painting #ifdef USE_MEM_DC CMemDC pDC(&dc); #else CDC* pDC = &dc; #endif int nRadius = m_nRadius; // Draw (clear) the background CRect rc; GetClientRect(rc); pDC->SelectStockObject(NULL_BRUSH); pDC->SelectStockObject(NULL_PEN); pDC->FillSolidRect(rc, ::GetSysColor(COLOR_BTNFACE)); // Draw the sliders channel if(!m_bDrawRadioButton) { DrawCircle(pDC, m_ptCenter, nRadius--, ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DHIGHLIGHT)); DrawCircle(pDC, m_ptCenter, nRadius, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DLIGHT)); } int nPos = (((GetPos()-nMin)*360/(nMax-nMin)) + m_nZero + 360) % 360; if(m_bInverted) nPos = 360-nPos; const double dPos = ((double)(nPos))*pi/180.0; CPoint ptKnobCenter; #pragma warning(disable:4244) // Disable warning "Converting 'double' to 'int', possible loss of data" if(m_bDrawRadioButton) { ptKnobCenter = CPoint(m_ptCenter.x + (nRadius-m_nKnobRadius) * sin(dPos), m_ptCenter.y - (nRadius-m_nKnobRadius) * cos(dPos)); } else { ptKnobCenter = CPoint(m_ptCenter.x + (nRadius) * sin(dPos), m_ptCenter.y - (nRadius) * cos(dPos)); } #pragma warning(default:4244) m_ptKnobCenter = ptKnobCenter; if(m_bDrawRadioButton) { nRadius += 2; } else { nRadius -= 2; } if(!bDisabled) { CBrush* pOldBrush = pDC->SelectObject(CBrush::FromHandle(m_hDialBrush)); pDC->Ellipse(m_ptCenter.x - nRadius + 1, m_ptCenter.y - nRadius + 1, m_ptCenter.x + nRadius + 1, m_ptCenter.y + nRadius + 1); pDC->SelectObject(pOldBrush); } DrawCircle(pDC, m_ptCenter, nRadius--, ::GetSysColor(COLOR_3DHIGHLIGHT), ::GetSysColor(COLOR_3DDKSHADOW)); DrawCircle(pDC, m_ptCenter, nRadius--, ::GetSysColor(COLOR_3DLIGHT), ::GetSysColor(COLOR_3DSHADOW)); // Draw the knob int nKnobRadius = m_nKnobRadius; if(m_bDrawRadioButton) { nKnobRadius *= 4; nKnobRadius /= 5; } const CRect rcKnob(ptKnobCenter.x - nKnobRadius + 2, ptKnobCenter.y - nKnobRadius + 2, ptKnobCenter.x + nKnobRadius, ptKnobCenter.y + nKnobRadius); CRgn rgnKnob; rgnKnob.CreateEllipticRgnIndirect(rcKnob); if(bDisabled) { pDC->FillRgn(&rgnKnob, CBrush::FromHandle(::GetSysColorBrush(COLOR_BTNFACE))); } else { pDC->FillRgn(&rgnKnob, CBrush::FromHandle(m_hKnobBrush)); } rgnKnob.DeleteObject(); if(m_bDrawRadioButton || m_bDragging) { DrawCircle(pDC, ptKnobCenter, --nKnobRadius, ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DHIGHLIGHT)); DrawCircle(pDC, ptKnobCenter, --nKnobRadius, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DLIGHT)); } else { DrawCircle(pDC, ptKnobCenter, --nKnobRadius, ::GetSysColor(COLOR_3DHIGHLIGHT), ::GetSysColor(COLOR_3DDKSHADOW)); DrawCircle(pDC, ptKnobCenter, --nKnobRadius, ::GetSysColor(COLOR_3DLIGHT), ::GetSysColor(COLOR_3DSHADOW)); } // Draw the focus circle on the inside of the knob if(!m_bDrawRadioButton && (GetFocus() == this)) { DrawCircle(pDC, ptKnobCenter, nKnobRadius-2, RGB(0, 0, 0), TRUE); } // Draw the text const CString strFormattedText = OnFormatText(); if(!strFormattedText.IsEmpty()) { CFont* pOldFont = pDC->SelectObject(&m_font); const CSize szExtent = pDC->GetTextExtent(strFormattedText); const CPoint ptText = CPoint(m_ptCenter.x - szExtent.cx/2, m_ptCenter.y - szExtent.cy/2); const int nOldTextColor = pDC->SetTextColor(m_crText); pDC->SetBkMode(TRANSPARENT); if(bDisabled) { pDC->DrawState(ptText, szExtent, strFormattedText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL); } else { pDC->TextOut(ptText.x, ptText.y, strFormattedText); } // Clean up pDC->SelectObject(pOldFont); pDC->SetTextColor(nOldTextColor); } // Don't call CSliderCtrl::OnPaint() }
INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { TRecvContactsData* wndData = (TRecvContactsData*)GetWindowLong(hwndDlg, DWLP_USER); switch (msg) { case WM_INITDIALOG: { CLISTEVENT* pcle = (CLISTEVENT*)lParam; /// got it TranslateDialogDefault(hwndDlg); WindowList_Add(ghRecvWindowList, hwndDlg, pcle->hContact); SendMessageT(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS))); EnableDlgItem(hwndDlg, IDOK, FALSE); EnableDlgItem(hwndDlg, IDDETAILS, FALSE); wndData = new TRecvContactsData(pcle->hContact); SetWindowLong(hwndDlg, DWLP_USER, (LONG)wndData); wndData->mhDbEvent = pcle->hDbEvent; /// initialized, pcle not needed anymore wndData->mhListIcon = ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLORDDB|ILC_MASK, 0, 1); wndData->mhPopup = LoadMenu(hInst, MAKEINTRESOURCE(IDR_CONTACTMENU)); CallService(MS_LANGPACK_TRANSLATEMENU, (WPARAM)wndData->mhPopup, 0); wndData->hHook = HookEventMessage(ME_PROTO_ACK, hwndDlg, HM_EVENTSENT); char *szProto = GetContactProto(wndData->mhContact); HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); ListView_SetExtendedListViewStyle(hLV, LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT); // add columns RecvListView_AddColumn(hLV, 120, (char*)SRCCallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDTEXT, 0), FALSE, 0); RecvListView_AddColumn(hLV, 100, "Nick", TRUE, 1); RecvListView_AddColumn(hLV, 100, "First Name", TRUE, 2); RecvListView_AddColumn(hLV, 100, "Last Name", TRUE, 3); // fill in groups SendMessageT(GetDlgItem(hwndDlg, IDC_ENABLEGROUPS), BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0); RebuildGroupCombo(hwndDlg); { // fill listview with received contacts DBEVENTINFO dbe = {0}; dbe.cbSize = sizeof(DBEVENTINFO); dbe.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)wndData->mhDbEvent, 0); if (dbe.cbBlob != -1) // this marks an invalid hDbEvent - all smashed anyway... dbe.pBlob = (PBYTE)_malloca(dbe.cbBlob); CallService(MS_DB_EVENT_GET, (WPARAM)wndData->mhDbEvent, (LPARAM)&dbe); char* pcBlob = (char*)dbe.pBlob; char* pcEnd = (char*)dbe.pBlob + dbe.cbBlob; HICON hiProto = LoadContactProtoIcon(wndData->mhContact); ImageList_AddIcon(wndData->mhListIcon, hiProto); DestroyIcon(hiProto); // imagelist copied the resource ListView_SetImageList(hLV, wndData->mhListIcon, LVSIL_SMALL); LVITEM lvi = {0}; lvi.iImage = 0; lvi.mask = LVIF_TEXT | LVIF_IMAGE; for (int nItem = 0; ; nItem++) { // Nick int strsize = (int)strlennull(pcBlob); TReceivedItem* pItem = wndData->AddReceivedItem(); if (dbe.flags & DBEF_UTF) pItem->mcaNick = utf8_to_tchar((unsigned char*)pcBlob); else pItem->mcaNick = ansi_to_tchar(pcBlob); pcBlob += strsize + 1; // UIN strsize = (int)strlennull(pcBlob); pItem->mcaUIN = null_strdup(pcBlob); pcBlob += strsize + 1; // add to listview lvi.iItem = nItem; lvi.pszText = pItem->mcaUIN; ListView_InsertItem(hLV, &lvi); // with image ListView_SetItemTextT(hLV, nItem, 1, pItem->mcaNick); // check for end of contacts if (pcBlob >= pcEnd) break; } } // new dlg init wndData->hIcons[0] = InitMButton(hwndDlg, IDC_ADD, MAKEINTRESOURCEA(IDI_ADDCONTACT), "Add Contact Permanently to List"); wndData->hIcons[1] = InitMButton(hwndDlg, IDC_DETAILS, MAKEINTRESOURCEA(IDI_USERDETAILS), "View User's Details"); wndData->hIcons[2] = InitMButton(hwndDlg, IDC_HISTORY, MAKEINTRESOURCEA(IDI_HISTORY), "View User's History"); wndData->hIcons[3] = InitMButton(hwndDlg, IDC_USERMENU, MAKEINTRESOURCEA(IDI_DOWNARROW), "User Menu"); SendMessageT(hwndDlg,DM_UPDATETITLE,0,0); // new dialog init done Utils_RestoreWindowPosition(hwndDlg, NULL, MODULENAME, ""); return TRUE; } case WM_NOTIFY: if (((LPNMHDR)lParam)->idFrom == IDC_CONTACTS) { switch (((LPNMHDR)lParam)->code) { case NM_DBLCLK: { HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); if (ListView_GetSelectedCount(hLV) != 1) break; // if not clicking on item, bye wndData->iPopupItem = ListView_GetNextItem(hLV, -1, LVNI_ALL|LVNI_SELECTED); if (wndData->iPopupItem == -1) break; // if no item selected no user details available return SendMessageT(hwndDlg, WM_COMMAND, ID_POPUP_USERDETAILS, 0); // show user details } case LVN_ITEMCHANGED: { LPNMLISTVIEW pNMLV = (LPNMLISTVIEW)lParam; HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); // optimisation, for FOR-Cycle bool bExistsCheckedItem = false; // there must be no checked items to disable "Add" button if (ListView_GetCheckState(hLV, pNMLV->iItem)) { // the user has checked this item bExistsCheckedItem = true; // enable "Add" button } else { // loop thru items and check if at least one is checked for (int i = 0; i < ListView_GetItemCount(hLV); i++) if (ListView_GetCheckState(hLV, i)) { // we found checked item, enable add, exit loop bExistsCheckedItem = true; break; } } EnableDlgItem(hwndDlg, IDOK, bExistsCheckedItem); EnableDlgItem(hwndDlg, IDDETAILS, ListView_GetSelectedCount(hLV) > 0); break; } } } break; case WM_COMMAND: { if (!lParam && CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)wndData->mhContact)) break; switch(LOWORD(wParam)) { case IDOK: // "Add Selected" button click { // for each selected item, find its index in the hDbEvent // and after that add this item to the DB permanently char* caUIN; HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); HWND hGroupsCombo = GetDlgItem(hwndDlg, IDC_GROUPS); HWND hGroupsCheck = GetDlgItem(hwndDlg, IDC_ENABLEGROUPS); int curs = SendMessageT(hGroupsCombo, CB_GETCURSEL, 0, 0); TCHAR* caGroup = NULL; int nGroupId = -1; if (curs != CB_ERR && IsWindowEnabled(hGroupsCheck) && SendMessageT(hGroupsCheck, BM_GETCHECK, 0, 0)) { //got groups, get the one selected in combo TCHAR* caGroup = (TCHAR*)_malloca((SendMessageT(hGroupsCombo, CB_GETLBTEXTLEN, curs, 0) + 1) * sizeof(WCHAR)); SendMessageT(hGroupsCombo, CB_GETLBTEXT, curs, (LPARAM)caGroup); nGroupId = SendMessageT(hGroupsCombo, CB_GETITEMDATA, curs, 0); } for (int i = 0; i < ListView_GetItemCount(hLV); i++) if (ListView_GetCheckState(hLV, i)) { // found checked contact item, add it caUIN = ListView_GetItemTextEx(hLV, i, 0); for (int j = 0; j < wndData->cbReceived; j++) // determine item index in packet if (!strcmpnull(wndData->maReceived[j]->mcaUIN, caUIN)) { char* szProto = GetContactProto(wndData->mhContact); HANDLE hContact = (HANDLE)SRCCallProtoService(szProto, PS_ADDTOLISTBYEVENT, MAKEWPARAM(0, j), (LPARAM)wndData->mhDbEvent); if (hContact && caGroup) { // use newest group API if available if (ServiceExists(MS_CLIST_CONTACTCHANGEGROUP)) CallService(MS_CLIST_CONTACTCHANGEGROUP, (WPARAM)hContact, (LPARAM)nGroupId); else DBWriteContactSettingStringT(hContact, "CList", "Group", caGroup); } break; } SAFE_FREE((void**)&caUIN); } // move to next item break; } case IDDETAILS: { // for each selected item, find its index in the hDbEvent // and after that add this item to the DB // finally, request Details window for this hContact HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); for (int i = 0; i < ListView_GetItemCount(hLV); i++) if (ListView_GetItemState(hLV, i, LVIS_SELECTED)) { HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, i); if (hContact) CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0); } break; } case IDCANCEL: { SendMessageT(hwndDlg, WM_CLOSE, 0, 0); break; } case IDC_ENABLEGROUPS: { EnableGroupCombo(hwndDlg); break; } case IDC_GROUPS: { // rebuild group list on popup if (HIWORD(wParam) == CBN_DROPDOWN) RebuildGroupCombo(hwndDlg); break; } case ID_POPUP_ADDUSER: { HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); if (hContact) DialogAddContactExecute(hwndDlg, hContact); break; } case ID_POPUP_USERDETAILS: { HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); if (hContact) CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0 ); break; } case ID_POPUP_SENDMESSAGE: { HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); if (hContact) CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact, 0); break; } case IDC_USERMENU: { RECT rc; HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM)wndData->mhContact, 0); GetWindowRect(GetDlgItem(hwndDlg,IDC_USERMENU), &rc); TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); DestroyMenu(hMenu); break; } case IDC_HISTORY: CallService(MS_HISTORY_SHOWCONTACTHISTORY,(WPARAM)wndData->mhContact,0); break; case IDC_DETAILS: CallService(MS_USERINFO_SHOWDIALOG,(WPARAM)wndData->mhContact,0); break; case IDC_ADD: DialogAddContactExecute(hwndDlg, wndData->mhContact); break; } break; } case WM_CONTEXTMENU: { HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); LVHITTESTINFO lvh; RECT rt; wndData->iPopupItem = -1; if ((HWND)wParam != hLV) break; // if not our ListView go away lvh.pt.x = LOWORD(lParam); lvh.pt.y = HIWORD(lParam); if (GetWindowRect(hLV, &rt)==0) return FALSE; // ?? why this, some check ?? ScreenToClient(hLV, &lvh.pt); // convert to ListView local coordinates int ci = ListView_HitTest(hLV, &lvh); if (ci==-1) break; // mouse is not over any item wndData->iPopupItem = ci; TrackPopupMenu(GetSubMenu(wndData->mhPopup, 0), TPM_LEFTALIGN|TPM_TOPALIGN, LOWORD(lParam), HIWORD(lParam), 0, hwndDlg, NULL); break; } case HM_EVENTSENT: { ACKDATA *ack=(ACKDATA*)lParam; if (ack->type!=ACKTYPE_SEARCH) break; // not search ack, go away if (ack->hProcess!=wndData->rhSearch) break; //not our search, go away if (ack->result==ACKRESULT_DATA) { HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); PROTOSEARCHRESULT* psr = (PROTOSEARCHRESULT*)ack->lParam; LVFINDINFO fi; fi.flags = LVFI_STRING; fi.psz = wndData->haUin; int iLPos = ListView_FindItem(hLV, -1, &fi); if (iLPos==-1) iLPos=0; // ListView_SetItemText(hLV, iLPos, 0, psr->email); // not sent by ICQ, and currently unsupported either if (strcmpnull(psr->nick, "") && psr->nick) ListView_SetItemText(hLV, iLPos, 1, psr->nick); ListView_SetItemText(hLV, iLPos, 2, psr->firstName); ListView_SetItemText(hLV, iLPos, 3, psr->lastName); break; } SAFE_FREE((void**)&wndData->haUin); break; } case WM_CLOSE: // user closed window, so destroy it { WindowList_Remove(ghRecvWindowList, hwndDlg); DestroyWindow(hwndDlg); break; } case WM_DESTROY: // last message received by this dialog, cleanup { CallService(MS_DB_EVENT_MARKREAD, (WPARAM)wndData->mhContact, (LPARAM)wndData->mhDbEvent); Utils_SaveWindowPosition(hwndDlg, NULL, MODULENAME, ""); ImageList_Destroy(wndData->mhListIcon); UnhookEvent(wndData->hHook); DestroyMenu(wndData->mhPopup); for (int i=0; i < SIZEOF(wndData->hIcons); i++) DestroyIcon(wndData->hIcons[i]); delete wndData; // automatically calls destructor break; } case WM_MEASUREITEM: return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); case WM_DRAWITEM: { DrawProtocolIcon(hwndDlg, lParam, wndData->mhContact); return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); } case WM_SIZE: { // make the dlg resizeable UTILRESIZEDIALOG urd = {0}; if (IsIconic(hwndDlg)) break; urd.cbSize = sizeof(urd); urd.hInstance = hInst; urd.hwndDlg = hwndDlg; urd.lParam = 0; // user-defined urd.lpTemplate = MAKEINTRESOURCEA(IDD_RECEIVE); urd.pfnResizer = RecvDlg_Resize; CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM) & urd); break; } case WM_GETMINMAXINFO: { MINMAXINFO* mmi=(MINMAXINFO*)lParam; mmi->ptMinTrackSize.x = 480+2*GetSystemMetrics(SM_CXSIZEFRAME); mmi->ptMinTrackSize.y = 130+2*GetSystemMetrics(SM_CYSIZEFRAME); break; } case DM_UPDATETITLE: { UpdateDialogTitle(hwndDlg, wndData?wndData->mhContact:NULL, "Contacts from"); if (wndData) UpdateDialogAddButton(hwndDlg, wndData->mhContact); break; } } return FALSE; }
INT_PTR CALLBACK SendDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { TSendContactsData* wndData = (TSendContactsData*)GetWindowLongPtr(hwndDlg, DWLP_USER); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS))); SetAllContactChecks(GetDlgItem(hwndDlg, IDC_LIST), lParam); WindowList_Add(g_hSendWindowList, hwndDlg, lParam); wndData = new TSendContactsData(lParam); SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)wndData); // new dlg init wndData->hIcons[0] = InitMButton(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGENT("Add Contact Permanently to List")); wndData->hIcons[1] = InitMButton(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGENT("View User's Details")); wndData->hIcons[2] = InitMButton(hwndDlg, IDC_HISTORY, SKINICON_OTHER_HISTORY, LPGENT("View User's History")); wndData->hIcons[3] = InitMButton(hwndDlg, IDC_USERMENU, SKINICON_OTHER_DOWNARROW, LPGENT("User Menu")); SendMessage(hwndDlg, DM_UPDATETITLE, 0, 0); // new dialog init done return TRUE; case WM_SETFOCUS: SetFocus(GetDlgItem(hwndDlg, IDC_LIST)); break; case WM_NOTIFY: if (((LPNMHDR)lParam)->idFrom == IDC_LIST) { switch (((LPNMHDR)lParam)->code) { case CLN_NEWCONTACT: case CLN_LISTREBUILT: // rebuild list if (wndData) SetAllContactChecks(GetDlgItem(hwndDlg, IDC_LIST), wndData->hContact); } } break; case WM_TIMER: if (wParam == TIMERID_MSGSEND) { KillTimer(hwndDlg, wParam); wndData->ShowErrorDlg(hwndDlg, "The contacts send timed out.", TRUE); } break; case DM_ERRORDECIDED: EnableWindow(hwndDlg, TRUE); wndData->hError = NULL; switch (wParam) { case MSGERROR_CANCEL: wndData->UnhookProtoAck(); if (wndData->uacklist.Count) { for (int i = 0; i < wndData->uacklist.Count; i++) delete g_aAckData.Remove(wndData->uacklist.Items[i]); // remove our ackdata & release structure mir_free(wndData->uacklist.Items); wndData->uacklist.Items = NULL; wndData->uacklist.Count = 0; } EnableDlgItem(hwndDlg, IDOK, TRUE); EnableDlgItem(hwndDlg, IDC_LIST, TRUE); ShowWindow(hwndDlg, SW_SHOWNORMAL); SetFocus(GetDlgItem(hwndDlg, IDC_LIST)); break; case MSGERROR_DONE: // contacts were delivered succesfully after timeout SetFocus(GetDlgItem(hwndDlg, IDC_LIST)); wndData->UnhookProtoAck(); break; case MSGERROR_RETRY:// resend timeouted packets for (int i = 0; i < wndData->uacklist.Count; i++) { TAckData *lla = g_aAckData.Remove(wndData->uacklist.Items[i]); HANDLE hProcc = (HANDLE)CallContactService(wndData->hContact, PSS_CONTACTS, MAKEWPARAM(0, lla->nContacts), (LPARAM)lla->aContacts); if (!hProcc) { // if fatal do not include wndData->uacklist.Remove(wndData->uacklist.Items[i]); delete lla; // release the structure continue; } else { // update process code wndData->uacklist.Items[i] = hProcc; g_aAckData.Add(hProcc, lla); } }// collect TAckData for our window, resend break; } break; case WM_COMMAND: if (!lParam && CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)wndData->hContact)) break; switch (LOWORD(wParam)) { case IDOK: if (IsWindowEnabled(GetDlgItem(hwndDlg, IDOK))) { MCONTACT hContact, hItem; wndData->ClearContacts(); // do not include contacts twice HWND hList = GetDlgItem(hwndDlg, IDC_LIST); hContact = FindFirstClistContact(hList, &hItem); while (hContact) { // build list of contacts to send if (SendMessage(hList, CLM_GETCHECKMARK, (WPARAM)hItem, 0)) wndData->AddContact(hContact); hContact = FindNextClistContact(hList, hContact, &hItem); } /* send contacts */ if (!wndData->SendContacts(hwndDlg)) break; SetTimer(hwndDlg, TIMERID_MSGSEND, db_get_dw(NULL, "SRMsg", "MessageTimeout", TIMEOUT_MSGSEND), NULL); } break; case IDCANCEL: DestroyWindow(hwndDlg); break; case ID_SELECTALL: { // select all contacts HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST); MCONTACT hItem, hContact = FindFirstClistContact(hwndList, &hItem); while (hContact) { SendMessage(hwndList, CLM_SETCHECKMARK, (WPARAM)hItem, 1); hContact = FindNextClistContact(hwndList, hContact, &hItem); } } break; case IDC_USERMENU: { RECT rc; GetWindowRect(GetDlgItem(hwndDlg, IDC_USERMENU), &rc); HMENU hMenu = Menu_BuildContactMenu(wndData->hContact); TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); DestroyMenu(hMenu); } break; case IDC_HISTORY: CallService(MS_HISTORY_SHOWCONTACTHISTORY, (WPARAM)wndData->hContact, 0); break; case IDC_DETAILS: CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)wndData->hContact, 0); break; case IDC_ADD: DialogAddContactExecute(hwndDlg, wndData->hContact); break; } break; case HM_EVENTSENT: { ACKDATA *ack = (ACKDATA*)lParam; if (ack->type != ACKTYPE_CONTACTS) break; TAckData *ackData = g_aAckData.Get(ack->hProcess); if (ackData == NULL) break; // on unknown hprocc go away if (ackData->hContact != ack->hContact) break; // this is not ours, strange if (ack->result == ACKRESULT_FAILED) { // some process failed, show error dialog KillTimer(hwndDlg, TIMERID_MSGSEND); wndData->ShowErrorDlg(hwndDlg, (char *)ack->lParam, TRUE); // ackData get used in error handling, released there break; } DBEVENTINFO dbei = { sizeof(dbei) }; dbei.szModule = GetContactProto(ackData->hContact); dbei.eventType = EVENTTYPE_CONTACTS; dbei.flags = DBEF_SENT | DBEF_UTF; dbei.timestamp = time(NULL); //make blob TCTSend* maSend = (TCTSend*)_alloca(ackData->nContacts*sizeof(TCTSend)); memset(maSend, 0, (ackData->nContacts * sizeof(TCTSend))); dbei.cbBlob = 0; char* pBlob; int i; for (i = 0; i < ackData->nContacts; i++) { // prepare data & count size maSend[i].mcaNick = mir_utf8encodeT(pcli->pfnGetContactDisplayName(ackData->aContacts[i], 0)); maSend[i].mcaUIN = mir_utf8encodeT(ptrT(GetContactUID(ackData->aContacts[i]))); dbei.cbBlob += (DWORD)strlennull(maSend[i].mcaUIN) + (DWORD)strlennull((char*)maSend[i].mcaNick) + 2; } dbei.pBlob = (PBYTE)_alloca(dbei.cbBlob); for (i = 0, pBlob = (char*)dbei.pBlob; i < ackData->nContacts; i++) { strcpynull(pBlob, (char*)maSend[i].mcaNick); pBlob += strlennull(pBlob) + 1; strcpynull(pBlob, maSend[i].mcaUIN); pBlob += strlennull(pBlob) + 1; } db_event_add(ackData->hContact, &dbei); g_aAckData.Remove(ack->hProcess); // do not release here, still needed wndData->uacklist.Remove(ack->hProcess); // packet confirmed for (i = 0; i < ackData->nContacts; i++) { mir_free(maSend[i].mcaUIN); mir_free(maSend[i].mcaNick); } delete ackData; // all done, release structure if (!wndData->uacklist.Count) { SkinPlaySound("SentContacts"); KillTimer(hwndDlg, TIMERID_MSGSEND); if (wndData->hError) SendMessage(wndData->hError, DM_ERRORDECIDED, MSGERROR_DONE, 0); SendMessage(hwndDlg, WM_CLOSE, 0, 0); // all packets confirmed, close the dialog } } break; case WM_MEASUREITEM: return Menu_MeasureItem((LPMEASUREITEMSTRUCT)lParam); case WM_DRAWITEM: DrawProtocolIcon(hwndDlg, lParam, wndData->hContact); return Menu_DrawItem((LPDRAWITEMSTRUCT)lParam); case DM_UPDATETITLE: UpdateDialogTitle(hwndDlg, wndData ? wndData->hContact : NULL, TranslateT("Send Contacts to")); if (wndData) UpdateDialogAddButton(hwndDlg, wndData->hContact); break; case WM_CLOSE: wndData->UnhookProtoAck(); DestroyWindow(hwndDlg); break; case WM_DESTROY: WindowList_Remove(g_hSendWindowList, hwndDlg); delete wndData; break; } return FALSE; }
int iupdrvIsActive(Ihandle* ih) { return IsWindowEnabled(ih->handle); }
static INT_PTR CALLBACK ShutdownOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { WORD setting = db_get_w(NULL, "AutoShutdown", "ConfirmDlgCountdown", SETTING_CONFIRMDLGCOUNTDOWN_DEFAULT); if (setting < 3) setting = SETTING_CONFIRMDLGCOUNTDOWN_DEFAULT; SendDlgItemMessage(hwndDlg, IDC_SPIN_CONFIRMDLGCOUNTDOWN, UDM_SETRANGE, 0, MAKELPARAM(999, 3)); SendDlgItemMessage(hwndDlg, IDC_EDIT_CONFIRMDLGCOUNTDOWN, EM_SETLIMITTEXT, 3, 0); SendDlgItemMessage(hwndDlg, IDC_SPIN_CONFIRMDLGCOUNTDOWN, UDM_SETPOS, 0, MAKELPARAM(setting, 0)); SetDlgItemInt(hwndDlg, IDC_EDIT_CONFIRMDLGCOUNTDOWN, setting, FALSE); } CheckDlgButton(hwndDlg, IDC_CHECK_SMARTOFFLINECHECK, db_get_b(NULL, "AutoShutdown", "SmartOfflineCheck", SETTING_SMARTOFFLINECHECK_DEFAULT) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_REMEMBERONRESTART, db_get_b(NULL, "AutoShutdown", "RememberOnRestart", SETTING_REMEMBERONRESTART_DEFAULT) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_SHOWCONFIRMDLG, db_get_b(NULL, "AutoShutdown", "ShowConfirmDlg", SETTING_SHOWCONFIRMDLG_DEFAULT) != 0 ? BST_CHECKED : BST_UNCHECKED); { BOOL enabled = ServiceIsTypeEnabled(SDSDT_SHUTDOWN, 0); if (enabled) { if (ServiceExists(MS_WEATHER_UPDATE)) { EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK_WEATHER), TRUE); CheckDlgButton(hwndDlg, IDC_CHECK_WEATHER, db_get_b(NULL, "AutoShutdown", "WeatherShutdown", SETTING_WEATHERSHUTDOWN_DEFAULT) != 0 ? BST_CHECKED : BST_UNCHECKED); } } } SendMessage(hwndDlg, M_ENABLE_SUBCTLS, 0, 0); return TRUE; /* default focus */ case M_ENABLE_SUBCTLS: { BOOL checked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_SHOWCONFIRMDLG) != 0; if (checked != IsWindowEnabled(GetDlgItem(hwndDlg, IDC_EDIT_CONFIRMDLGCOUNTDOWN))) { EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_CONFIRMDLGCOUNTDOWN), checked); EnableWindow(GetDlgItem(hwndDlg, IDC_SPIN_CONFIRMDLGCOUNTDOWN), checked); EnableWindow(GetDlgItem(hwndDlg, IDC_TEXT_COUNTDOWNSTARTS), checked); EnableWindow(GetDlgItem(hwndDlg, IDC_TEXT_SECONDS), checked); } return TRUE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_EDIT_CONFIRMDLGCOUNTDOWN: if (HIWORD(wParam) == EN_KILLFOCUS) if ((int)GetDlgItemInt(hwndDlg, IDC_EDIT_CONFIRMDLGCOUNTDOWN, NULL, TRUE) < 3) { SendDlgItemMessage(hwndDlg, IDC_SPIN_CONFIRMDLGCOUNTDOWN, UDM_SETPOS, 0, MAKELPARAM(3, 0)); SetDlgItemInt(hwndDlg, IDC_EDIT_CONFIRMDLGCOUNTDOWN, 3, FALSE); } if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return TRUE; /* no apply */ break; } PostMessage(hwndDlg, M_ENABLE_SUBCTLS, 0, 0); PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); /* enable apply */ return FALSE; case WM_NOTIFY: switch (((NMHDR*)lParam)->code) { case PSN_APPLY: db_set_b(NULL, "AutoShutdown", "ShowConfirmDlg", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CHECK_SHOWCONFIRMDLG) != 0)); db_set_w(NULL, "AutoShutdown", "ConfirmDlgCountdown", (WORD)GetDlgItemInt(hwndDlg, IDC_EDIT_CONFIRMDLGCOUNTDOWN, NULL, FALSE)); db_set_b(NULL, "AutoShutdown", "RememberOnRestart", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CHECK_REMEMBERONRESTART) != 0)); db_set_b(NULL, "AutoShutdown", "SmartOfflineCheck", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CHECK_SMARTOFFLINECHECK) != 0)); if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_CHECK_WEATHER))) db_set_b(NULL, "AutoShutdown", "WeatherShutdown", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_CHECK_WEATHER) != 0)); return TRUE; } break; } return FALSE; }
//WNDPROC to handle Custom Combo Box's messages LRESULT CALLBACK CCustomComboBox::WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { CCustomComboBox *pcb = (CCustomComboBox *)GetWindowLongPtr(hwnd, GWLP_USERDATA); wyInt32 ret = -1; if(message >= 0x0140 && message <= 0x0163) { // if messages recieved are CB_SETCURSEL, CB_SELECTSTRING or CB_DELETESTRING, then set the flag to edit Edit Control if((message == CB_SETCURSEL || message == CB_SELECTSTRING || message == CB_DELETESTRING) && pcb != NULL) { pcb->m_fillText = wyTrue; } ret = SendMessage(pcb->m_hwndCombo, message, wparam, lparam); return ret; } switch(message) { case WM_GETTEXTLENGTH: case WM_GETFONT: case WM_GETTEXT: return SendMessage(pcb->m_hwndCombo, message, wparam, lparam); break; case WM_NCCREATE: { pcb = new CCustomComboBox(); SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pcb); } break; case CCBM_SETMARGIN: pcb->SetMargin(lparam); return 0; break; case CCBM_NOSHOWDROPDOWN: pcb->m_showDropDown = wyFalse; break; case CCBM_GETCOMBOHWND: return (LRESULT)pcb->m_hwndCombo; break; case WM_CREATE: pcb->CreateCtrls(hwnd, lparam); break; case WM_COMMAND: pcb->HandleWmCommand(hwnd, wparam, lparam); break; case WM_SETTEXT: pcb->m_fillText = wyTrue; ret = SetWindowText(pcb->m_hwndCombo, (wyWChar *)lparam); InvalidateRect(pcb->m_hwndCombo, NULL, TRUE); UpdateWindow(pcb->m_hwndCombo); return ret; break; case WM_NOTIFY: SendMessage(pcb->m_hwndParent, message, wparam, lparam); break; case WM_SETFOCUS: if(pcb) { SetFocus(pcb->m_hwndCombo); InvalidateRect(pcb->m_hwndCombo, NULL, TRUE); } return 1; break; case WM_DRAWITEM: return SendMessage(pcb->m_hwndParent, message, wparam, lparam); break; case WM_MEASUREITEM: return SendMessage(pcb->m_hwndParent, message, wparam, lparam); break; case WM_HELP: PostMessage(pcb->m_hwndParent, message, wparam, lparam); break; case WM_DESTROY: if(pcb->m_hwndCombo) { DestroyWindow(pcb->m_hwndCombo); delete(pcb); } break; case WM_ENABLE: { switch(wparam) { case TRUE: if(IsWindowEnabled(pcb->m_hwndCombo) == FALSE) { pcb->SetMargin(NULL); } break; case FALSE: if(IsWindowEnabled(pcb->m_hwndCombo) == TRUE) { pcb->SetMargin(NULL); } break; } EnableWindow(pcb->m_hwndCombo, wparam); InvalidateRect(pcb->m_hwndCombo, NULL, TRUE); } } return DefWindowProc(hwnd, message, wparam, lparam); }
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_INITDIALOG || uMsg == WM_NOTIFY_OUTER_NEXT) { page *this_page; static DLGPROC winprocs[]= { #ifdef NSIS_CONFIG_LICENSEPAGE LicenseProc, #endif #ifdef NSIS_CONFIG_COMPONENTPAGE SelProc, #endif DirProc, InstProc, #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT UninstProc #endif }; m_delta = wParam; if (uMsg == WM_INITDIALOG) { g_hwnd=hwndDlg; m_hwndOK=GetDlgItem(hwndDlg,IDOK); m_hwndCancel=GetDlgItem(hwndDlg,IDCANCEL); SetDlgItemTextFromLang(hwndDlg,IDC_VERSTR,LANG_BRANDING); SetClassLong(hwndDlg,GCL_HICON,(long)g_hIcon); #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT) g_quit_flag = ExecuteCallbackFunction(CB_ONGUIINIT); #endif //ShowWindow(hwndDlg, SW_SHOW); m_delta = 1; } this_page=g_pages+m_page; if (m_page>=0) { #ifdef NSIS_SUPPORT_CODECALLBACKS // Call leave function. If Abort used don't move to the next page. // But if quit called we must exit now if (m_delta==1) if (ExecuteCodeSegment(this_page->leavefunc,NULL)) { SendMessage(m_curwnd, WM_IN_UPDATEMSG, 0, 1); return !g_quit_flag; } #endif // if the last page was a custom page, wait for it to finish by itself. // if it doesn't, it's a BAD plugin. // plugins should react to WM_NOTIFY_OUTER_NEXT. if (!this_page->dlg_id) return 0; } NotifyCurWnd(WM_NOTIFY_INIGO_MONTOYA); nextPage: m_page+=m_delta; this_page+=m_delta; #ifdef NSIS_SUPPORT_CODECALLBACKS if (m_page==g_blocks[NB_PAGES].num) ExecuteCallbackFunction(CB_ONINSTSUCCESS); #endif//NSIS_SUPPORT_CODECALLBACKS if (g_quit_flag || (unsigned int)m_page >= (unsigned int)g_blocks[NB_PAGES].num) { DestroyWindow(m_curwnd); g_hwnd = 0; EndDialog(hwndDlg,m_retcode); } else { HWND hwndtmp; int pflags = this_page->flags; GetNSISString(state_click_next, this_page->clicknext); SetDlgItemTextFromLang(hwndDlg, IDOK, this_page->next); SetDlgItemTextFromLang(hwndDlg, IDC_BACK, this_page->back); SetDlgItemTextFromLang(hwndDlg, IDCANCEL, this_page->cancel); hwndtmp = GetDlgItem(hwndDlg, IDC_BACK); if (g_exec_flags.abort) { pflags &= ~(PF_BACK_ENABLE | PF_NEXT_ENABLE); pflags |= PF_CANCEL_ENABLE; } ShowWindow(hwndtmp, pflags & PF_BACK_SHOW);// SW_HIDE = 0, PF_BACK_SHOW = SW_SHOWNA = 8 EnableWindow(hwndtmp, pflags & PF_BACK_ENABLE); EnableNext(pflags & PF_NEXT_ENABLE); EnableWindow(m_hwndCancel, pflags & PF_CANCEL_ENABLE); SendMessage(hwndtmp, BM_SETSTYLE, BS_PUSHBUTTON, TRUE); if (g_exec_flags.abort) { SendMessage(hwndDlg, DM_SETDEFID, IDCANCEL, 0); SetActiveCtl(m_hwndCancel); } else { SetActiveCtl(m_hwndOK); } mystrcpy(g_tmp,g_caption); GetNSISString(g_tmp+mystrlen(g_tmp),this_page->caption); my_SetWindowText(hwndDlg,g_tmp); #ifdef NSIS_SUPPORT_CODECALLBACKS // custom page or user used abort in prefunc if (ExecuteCodeSegment(this_page->prefunc, NULL) || !this_page->dlg_id) { goto nextPage; } #endif //NSIS_SUPPORT_CODECALLBACKS if (this_page->wndproc_id != PWP_COMPLETED) { DestroyWindow(m_curwnd); } else { if (!g_exec_flags.abort && g_exec_flags.autoclose) goto nextPage; // no need to go to skipPage because PWP_COMPLETED always follows PWP_INSTFILES return FALSE; } // update g_this_page for the dialog proc g_this_page=this_page; if (this_page->dlg_id > 0) // NSIS page { m_curwnd=CreateDialogParam( g_hInstance, MAKEINTRESOURCE(this_page->dlg_id+dlg_offset), hwndDlg,winprocs[this_page->wndproc_id],(LPARAM)this_page ); if (m_curwnd) { RECT r; SetDlgItemTextFromLang(m_curwnd,IDC_INTROTEXT,this_page->parms[0]); GetWindowRect(GetDlgItem(hwndDlg,IDC_CHILDRECT),&r); ScreenToClient(hwndDlg,(LPPOINT)&r); SetWindowPos(m_curwnd,0,r.left,r.top,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER); #ifdef NSIS_SUPPORT_CODECALLBACKS ExecuteCodeSegment(this_page->showfunc,NULL); #endif //NSIS_SUPPORT_CODECALLBACKS ShowWindow(m_curwnd,SW_SHOWNA); NotifyCurWnd(WM_NOTIFY_START); } } } skipPage: if (!ui_dlg_visible && m_curwnd) { ShowWindow(hwndDlg, SW_SHOWDEFAULT); ui_dlg_visible = 1; } return FALSE; } #ifdef NSIS_SUPPORT_BGBG if (uMsg == WM_WINDOWPOSCHANGED) { SetWindowPos(m_bgwnd, hwndDlg, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); } if (uMsg == WM_SIZE) { ShowWindow(m_bgwnd, wParam == SIZE_MINIMIZED ? SW_HIDE : SW_SHOW); } #endif //NSIS_SUPPORT_BGBG if (uMsg == WM_NOTIFY_CUSTOM_READY) { DestroyWindow(m_curwnd); m_curwnd = (HWND)wParam; goto skipPage; } if (uMsg == WM_QUERYENDSESSION) { SetWindowLong(hwndDlg, DWL_MSGRESULT, FALSE); return TRUE; } if (uMsg == WM_CLOSE && m_page == g_blocks[NB_PAGES].num - 1) { if (!IsWindowEnabled(m_hwndCancel)) { uMsg = WM_COMMAND; wParam = IDOK; } } if (uMsg == WM_COMMAND) { int id = LOWORD(wParam); HWND hCtl = GetDlgItem(hwndDlg, id); if (hCtl) { SendMessage(hCtl, BM_SETSTATE, FALSE, 0); if (!IsWindowEnabled(hCtl)) return 0; } if (id == IDOK) { outernotify(1); } else if (id == IDC_BACK && m_page>0) { outernotify(-1); } else if (id == IDCANCEL) { if (g_exec_flags.abort) { #ifdef NSIS_SUPPORT_CODECALLBACKS ExecuteCallbackFunction(CB_ONINSTFAILED); #endif//NSIS_SUPPORT_CODECALLBACKS m_retcode=2; outernotify(NOTIFY_BYE_BYE); } else { #ifdef NSIS_SUPPORT_CODECALLBACKS if (!ExecuteCallbackFunction(CB_ONUSERABORT)) #endif//NSIS_SUPPORT_CODECALLBACKS { m_retcode=1; outernotify(NOTIFY_BYE_BYE); } } } else { // Forward WM_COMMANDs to inner dialogs, can be custom ones. // Without this, enter on buttons in inner dialogs won't work. SendMessage(m_curwnd, WM_COMMAND, wParam, lParam); } } return HandleStaticBkColor(); }
/** * name: PaintThemeButton * desc: Draws the none themed button * param: ctl - BTNCTRL structure for the button * hdcMem - device context to draw to * rcClient - rectangle of the whole button * return: nothing **/ static void __fastcall PaintButton(BTNCTRL *ctl, HDC hdcMem, LPRECT rcClient) { RECT rcText = { 0, 0, 0, 0 }; TCHAR szText[MAX_PATH] = { 0 }; WORD ccText; // Draw the flat button if (ctl->dwStyle & MBS_FLAT) { HBRUSH hbr = NULL; if (ctl->stateId == PBS_PRESSED || ctl->stateId == PBS_HOT) hbr = GetSysColorBrush(COLOR_3DLIGHT); else { HDC dc; HWND hwndParent; hwndParent = GetParent(ctl->hwnd); if (dc = GetDC(hwndParent)) { hbr = (HBRUSH)SendMessage(hwndParent, WM_CTLCOLORDLG, (WPARAM)dc, (LPARAM)hwndParent); ReleaseDC(hwndParent, dc); } } if (hbr) { FillRect(hdcMem, rcClient, hbr); DeleteObject(hbr); } if (ctl->stateId == PBS_HOT || ctl->bFocus) { if (ctl->pbState) DrawEdge(hdcMem, rcClient, EDGE_ETCHED, BF_RECT|BF_SOFT); else DrawEdge(hdcMem, rcClient, BDR_RAISEDOUTER, BF_RECT|BF_SOFT|BF_FLAT); } else if (ctl->stateId == PBS_PRESSED) DrawEdge(hdcMem, rcClient, BDR_SUNKENOUTER, BF_RECT|BF_SOFT); } else { UINT uState = DFCS_BUTTONPUSH|((ctl->stateId == PBS_HOT) ? DFCS_HOT : 0)|((ctl->stateId == PBS_PRESSED) ? DFCS_PUSHED : 0); if (ctl->defbutton&&ctl->stateId==PBS_NORMAL) uState |= DLGC_DEFPUSHBUTTON; DrawFrameControl(hdcMem, rcClient, DFC_BUTTON, uState); // Draw focus rectangle if button has focus if (ctl->bFocus) { RECT focusRect = *rcClient; InflateRect(&focusRect, -3, -3); DrawFocusRect(hdcMem, &focusRect); } } // calculate text rect { SIZE sizeText; HFONT hOldFont; ccText = GetWindowText(ctl->hwnd, szText, SIZEOF(szText)); if (ccText > 0) { hOldFont = (HFONT)SelectObject(hdcMem, ctl->hFont); GetTextExtentPoint32(hdcMem, szText, ccText, &sizeText); if (ctl->cHot) { SIZE sizeHot; GetTextExtentPoint32A(hdcMem, "&", 1, &sizeHot); sizeText.cx -= sizeHot.cx; } SelectObject(hdcMem, hOldFont); rcText.left = (ctl->hIcon) ? 0 : (rcClient->right - rcClient->left - sizeText.cx) / 2; rcText.top = (rcClient->bottom - rcClient->top - sizeText.cy) / 2; rcText.right = rcText.left + sizeText.cx; rcText.bottom = rcText.top + sizeText.cy; if (ctl->stateId == PBS_PRESSED) OffsetRect(&rcText, 1, 1); } } PaintIcon(ctl, hdcMem, &ccText, rcClient, &rcText); // draw text if (ccText > 0) { HFONT hOldFont; hOldFont = (HFONT)SelectObject(hdcMem, ctl->hFont); SetBkMode(hdcMem, TRANSPARENT); SetTextColor(hdcMem, IsWindowEnabled(ctl->hwnd) || !ctl->hThemeButton ? ctl->stateId == PBS_HOT ? GetSysColor(COLOR_HOTLIGHT) : GetSysColor(COLOR_BTNTEXT) : GetSysColor(COLOR_GRAYTEXT)); DrawState(hdcMem, NULL, NULL, (LPARAM)szText, 0, rcText.left, rcText.top, rcText.right - rcText.left, rcText.bottom - rcText.top, IsWindowEnabled(ctl->hwnd) || ctl->hThemeButton ? DST_PREFIXTEXT | DSS_NORMAL : DST_PREFIXTEXT | DSS_DISABLED); SelectObject(hdcMem, hOldFont); } }
static LRESULT CALLBACK RichUtil_Proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { TRichUtil *ru; EnterCriticalSection(&csRich); ru = rlist_find(slist, hwnd); LeaveCriticalSection(&csRich); switch(msg) { case WM_THEMECHANGED: case WM_STYLECHANGED: RichUtil_ClearUglyBorder(ru); break; case WM_NCPAINT: { LRESULT ret = mir_callNextSubclass(hwnd, RichUtil_Proc, msg, wParam, lParam); if (ru->hasUglyBorder && IsThemeActive()) { HANDLE hTheme = OpenThemeData(ru->hwnd, L"EDIT"); if (hTheme) { RECT rcBorder; RECT rcClient; int nState; HDC hdc = GetWindowDC(ru->hwnd); GetWindowRect(hwnd, &rcBorder); rcBorder.right -= rcBorder.left; rcBorder.bottom -= rcBorder.top; rcBorder.left = rcBorder.top = 0; CopyRect(&rcClient, &rcBorder); rcClient.left += ru->rect.left; rcClient.top += ru->rect.top; rcClient.right -= ru->rect.right; rcClient.bottom -= ru->rect.bottom; ExcludeClipRect(hdc, rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); if(IsThemeBackgroundPartiallyTransparent(hTheme, EP_EDITTEXT, ETS_NORMAL)) DrawThemeParentBackground(hwnd, hdc, &rcBorder); if (!IsWindowEnabled(hwnd)) nState = ETS_DISABLED; else if(SendMessage(hwnd, EM_GETOPTIONS, 0, 0) & ECO_READONLY) nState = ETS_READONLY; else nState = ETS_NORMAL; DrawThemeBackground(hTheme, hdc, EP_EDITTEXT, nState, &rcBorder, NULL); CloseThemeData(hTheme); ReleaseDC(hwnd, hdc); return 0; } } return ret; } case WM_NCCALCSIZE: { LRESULT ret = mir_callNextSubclass(hwnd, RichUtil_Proc, msg, wParam, lParam); NCCALCSIZE_PARAMS *ncsParam = (NCCALCSIZE_PARAMS*)lParam; if (ru->hasUglyBorder && IsThemeActive()) { HANDLE hTheme = OpenThemeData(hwnd, L"EDIT"); if (hTheme) { RECT rcClient; HDC hdc = GetDC(GetParent(hwnd)); ZeroMemory(&rcClient, sizeof(RECT)); if(GetThemeBackgroundContentRect(hTheme, hdc, EP_EDITTEXT, ETS_NORMAL, &ncsParam->rgrc[0], &rcClient) == S_OK) { ru->rect.left = rcClient.left-ncsParam->rgrc[0].left; ru->rect.top = rcClient.top-ncsParam->rgrc[0].top; ru->rect.right = ncsParam->rgrc[0].right-rcClient.right; ru->rect.bottom = ncsParam->rgrc[0].bottom-rcClient.bottom; CopyRect(&ncsParam->rgrc[0], &rcClient); CloseThemeData(hTheme); ReleaseDC(GetParent(hwnd), hdc); return WVR_REDRAW; } ReleaseDC(GetParent(hwnd), hdc); CloseThemeData(hTheme); } } return ret; } case WM_ENABLE: RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE|RDW_NOCHILDREN|RDW_UPDATENOW|RDW_FRAME); break; case WM_DESTROY: { LRESULT ret = mir_callNextSubclass(hwnd, RichUtil_Proc, msg, wParam, lParam); EnterCriticalSection(&csRich); slist = rlist_remove(slist, ru); LeaveCriticalSection(&csRich); if (ru) free(ru); return ret; } } return mir_callNextSubclass(hwnd, RichUtil_Proc, msg, wParam, lParam); }
static LRESULT CALLBACK RichUtil_Proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { TRichUtil *ru = NULL, tru; int idx; LRESULT ret; tru.hwnd = hwnd; { mir_cslock lck(csRich); if (List_GetIndex(&sListInt, &tru, &idx)) ru = (TRichUtil *)sListInt.items[idx]; } switch (msg) { case WM_THEMECHANGED: case WM_STYLECHANGED: RichUtil_ClearUglyBorder(ru); break; case WM_NCPAINT: ret = mir_callNextSubclass(hwnd, RichUtil_Proc, msg, wParam, lParam); if (ru->hasUglyBorder && IsThemeActive()) { HANDLE hTheme = OpenThemeData(ru->hwnd, L"EDIT"); if (hTheme) { RECT rcBorder; RECT rcClient; int nState; HDC hdc = GetWindowDC(ru->hwnd); GetWindowRect(hwnd, &rcBorder); rcBorder.right -= rcBorder.left; rcBorder.bottom -= rcBorder.top; rcBorder.left = rcBorder.top = 0; CopyRect(&rcClient, &rcBorder); rcClient.left += ru->rect.left; rcClient.top += ru->rect.top; rcClient.right -= ru->rect.right; rcClient.bottom -= ru->rect.bottom; ExcludeClipRect(hdc, rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); if (IsThemeBackgroundPartiallyTransparent(hTheme, EP_EDITTEXT, ETS_NORMAL)) DrawThemeParentBackground(hwnd, hdc, &rcBorder); if (!IsWindowEnabled(hwnd)) nState = ETS_DISABLED; else if (SendMessage(hwnd, EM_GETOPTIONS, 0, 0) & ECO_READONLY) nState = ETS_READONLY; else nState = ETS_NORMAL; DrawThemeBackground(hTheme, hdc, EP_EDITTEXT, nState, &rcBorder, NULL); CloseThemeData(hTheme); ReleaseDC(hwnd, hdc); return 0; } } return ret; case WM_NCCALCSIZE: { ret = mir_callNextSubclass(hwnd, RichUtil_Proc, msg, wParam, lParam); NCCALCSIZE_PARAMS *ncsParam = (NCCALCSIZE_PARAMS *)lParam; if (ru->hasUglyBorder && IsThemeActive()) { HANDLE hTheme = OpenThemeData(hwnd, L"EDIT"); if (hTheme) { RECT rcClient = {0}; HDC hdc = GetDC(GetParent(hwnd)); if (GetThemeBackgroundContentRect(hTheme, hdc, EP_EDITTEXT, ETS_NORMAL, &ncsParam->rgrc[0], &rcClient) == S_OK) { ru->rect.left = rcClient.left - ncsParam->rgrc[0].left; ru->rect.top = rcClient.top - ncsParam->rgrc[0].top; ru->rect.right = ncsParam->rgrc[0].right - rcClient.right; ru->rect.bottom = ncsParam->rgrc[0].bottom - rcClient.bottom; ncsParam->rgrc[0] = rcClient; CloseThemeData(hTheme); ReleaseDC(GetParent(hwnd), hdc); return WVR_REDRAW; } ReleaseDC(GetParent(hwnd), hdc); CloseThemeData(hTheme); } } } return ret; case WM_ENABLE: RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_NOCHILDREN | RDW_UPDATENOW | RDW_FRAME); break; case WM_GETDLGCODE: return mir_callNextSubclass(hwnd, RichUtil_Proc, msg, wParam, lParam) & ~DLGC_HASSETSEL; case WM_NCDESTROY: ret = mir_callNextSubclass(hwnd, RichUtil_Proc, msg, wParam, lParam); { mir_cslock lck(csRich); List_Remove(&sListInt, idx); } mir_free(ru); return ret; } return mir_callNextSubclass(hwnd, RichUtil_Proc, msg, wParam, lParam); }
LRESULT FlatButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { switch(nmsg) { case WM_MOUSEMOVE: { bool active = false; if (IsWindowEnabled(_hwnd)) { DWORD pid_foreground; HWND hwnd_foreground = GetForegroundWindow(); //@@ may be better look for WM_ACTIVATEAPP ? GetWindowThreadProcessId(hwnd_foreground, &pid_foreground); if (GetCurrentProcessId() == pid_foreground) { POINT pt = {GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)}; ClientRect clntRect(_hwnd); // highlight the button? if (pt.x>=clntRect.left && pt.x<clntRect.right && pt.y>=clntRect.top && pt.y<clntRect.bottom) active = true; } } if (active != _active) { _active = active; if (active) { TRACKMOUSEEVENT tme = {sizeof(tme), /*TME_HOVER|*/TME_LEAVE, _hwnd/*, HOVER_DEFAULT*/}; _TrackMouseEvent(&tme); } InvalidateRect(_hwnd, NULL, TRUE); } return 0;} case WM_LBUTTONUP: { POINT pt = {GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)}; ClientRect clntRect(_hwnd); // no more in the active rectangle? if (pt.x<clntRect.left || pt.x>=clntRect.right || pt.y<clntRect.top || pt.y>=clntRect.bottom) goto cancel_press; goto def;} case WM_CANCELMODE: cancel_press: { TRACKMOUSEEVENT tme = {sizeof(tme), /*TME_HOVER|*/TME_LEAVE|TME_CANCEL, _hwnd/*, HOVER_DEFAULT*/}; _TrackMouseEvent(&tme); _active = false; ReleaseCapture();} // fall through case WM_MOUSELEAVE: if (_active) { _active = false; InvalidateRect(_hwnd, NULL, TRUE); } return 0; default: def: return super::WndProc(nmsg, wparam, lparam); } }