BOOL CPpcMainWnd::InitImages() { InitSize(); BOOL fRet = CMainWnd::InitImages(); if (fRet) { ShowWindow(m_hwndLV, ((CPpcSkin*)m_pSkin)->IsPlaylistVisible() ? SW_SHOW : SW_HIDE); ListView_SetBkColor(m_hwndLV, ((CPpcSkin*)m_pSkin)->GetColor2(COLOR2_PLAYLISTBACK)); ListView_SetTextBkColor(m_hwndLV, ((CPpcSkin*)m_pSkin)->GetColor2(COLOR2_PLAYLISTBACK)); ListView_SetTextColor(m_hwndLV, ((CPpcSkin*)m_pSkin)->GetColor2(COLOR2_PLAYLISTTEXT)); m_hFntTitle = (HFONT)SendMessage(m_hWnd, WM_GETFONT, 0, 0); InvalidateRect(m_hwndLV, NULL, TRUE); UpdateWindow(m_hwndLV); // ボリュームスライダーが有効か無効か if (m_pSkin->GetImageList(IMAGELIST_VOLSLIDER) && m_pSkin->GetImageList(IMAGELIST_VOLTRACK)) { m_nVolumeSliderLeft = VOLSLIDER_LEFT; m_nVolumeSliderTop = PPC_VOLSLIDER_TOP; m_nVolumeSliderWidth = VOLSLIDER_WIDTH; m_nVolumeSliderHeight = VOLSLIDER_HEIGHT; } else { m_nVolumeSliderLeft = 0; m_nVolumeSliderTop = 0; m_nVolumeSliderWidth = 0; m_nVolumeSliderHeight = 0; } m_nBtnMax = PPC_BTN_MAX; } return fRet; }
// // Fill the given window with all the errors // void ErrorsFill(void *hwnd) { HWND hlist = HWND(hwnd); // Add columns to listview LV_COLUMN column; column.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; column.cx = LOG_COLUMN_WIDTH_TYPESHORT; column.pszText = ""; column.iSubItem = 0; ListView_InsertColumn(hlist, 0, &column); column.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; column.cx = LOG_COLUMN_WIDTH_LABELNAME; column.pszText = "Class"; column.iSubItem = 1; ListView_InsertColumn(hlist, 2, &column); column.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; column.cx = LOG_COLUMN_WIDTH_MESSAGE; column.pszText = "Message"; column.iSubItem = 2; ListView_InsertColumn(hlist, 3, &column); ListView_SetBkColor(hlist, RGB(0, 0, 0)); ListView_SetTextBkColor(hlist, RGB(0, 0, 0)); ListView_SetTextColor(hlist, RGB(191, 191, 0)); // Change the listviews font HFONT hfont; LOGFONT logfont; Utils::Memset(&logfont, 0x00, sizeof (LOGFONT)); logfont.lfHeight = -11; logfont.lfWeight = 400; logfont.lfOutPrecision = 3; logfont.lfClipPrecision = 2; logfont.lfQuality = 1; logfont.lfPitchAndFamily = 42; strcpy(logfont.lfFaceName, "Lucida Console"); hfont = CreateFontIndirect(&logfont); SendMessage(hlist, WM_SETFONT, (WPARAM) hfont, 0); // Add all of the items to the list view control U32 i = 0; while (i < numErrors) { LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = LPSTR_TEXTCALLBACK; lvi.iImage = 0; lvi.iItem = ListView_GetItemCount(hlist); lvi.iSubItem = 0; lvi.lParam = (LPARAM) &errorItems[i]; ListView_InsertItem(hlist, &lvi); i++; } numErrors = 0; }
void SetFontColor() { CHOOSECOLOR color; static COLORREF acrCustClr[16]; memset( &color, 0, sizeof( color ) ); color.hwndOwner = g_hMainWnd; color.lStructSize = sizeof( color ); color.Flags = CC_FULLOPEN | CC_RGBINIT; color.rgbResult = ListView_GetTextColor( g_hLogMsgWnd ); color.lpCustColors = acrCustClr; if ( !ChooseColor( &color ) ) return; ListView_SetTextColor( g_hLogMsgWnd, color.rgbResult ); InvalidateRect( g_hLogMsgWnd, NULL, TRUE ); }
INT_PTR CALLBACK HandleCrashDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) /*++ Routine Description: Dialog box used to ask user what action he wants to take when an application crashes. Arguments: Refer to DialogProc in MSDN Returns: TRUE - Message Handled FALSE - Message not handled --*/ { static PROC_DBG_DATA sProcDbgData; switch(msg) { case WM_INITDIALOG: { // // Insert *specific* dialog initialization code here. // lParam can contain information required for initialization. // // // Set dialog and application Icon // HICON hIcon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_APP_ICON_SM)); SendMessage (hDlg, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)hIcon); hIcon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_APP_ICON)); SendMessage (hDlg, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)hIcon); SetWindowText(hDlg, _T("IntellectualHeaven(R) CrashDoctor")); // // Set list control properties // HWND hListCtrl; hListCtrl = GetDlgItem(hDlg, IDC_LIST_DEBUGGER); ListView_SetExtendedListViewStyle( hListCtrl, LVS_EX_FULLROWSELECT); ListView_SetTextColor( hListCtrl, RGB(0, 0, 255)); LVCOLUMN lvColumn; lvColumn.mask = LVCF_TEXT | LVCF_WIDTH; lvColumn.cx = 260; lvColumn.pszText = _T(" Debuggers Available"); ListView_InsertColumn( hListCtrl, 0, &lvColumn); CenterDialog(hDlg); PPROC_DBG_DATA procDbgData = (PPROC_DBG_DATA)lParam; // // Store the PROC_DBG_DATA, it will be needed later // sProcDbgData = *procDbgData; // Find the process given in PROC_DBG_DATA DWORD processId = sProcDbgData.processId; IHU_PROCESS_INFO processInfo; IHU_PROCESS_LIST processList; IHU_PROCESS_LIST_ITER processListIter; bool processFound = false; IhuGetProcessList(processList); for ( processListIter = processList.begin(); processListIter != processList.end(); ++processListIter) { processInfo = *processListIter; if (processId == processInfo.mProcessId) { processFound = true; break; } } // // Set process name and image // if (processFound) { SetWindowText( GetDlgItem(hDlg, IDC_EDIT_PROCESS_NAME), processInfo.mBinaryName.c_str()); hIcon = NULL; IhuGetFileIcon( processInfo.mBinaryName, hIcon); if (hIcon) { SendMessage( GetDlgItem(hDlg, IDC_ICON_PROCESS), STM_SETICON, (WPARAM)hIcon, 0); } } else { SetWindowText( GetDlgItem(hDlg, IDC_EDIT_PROCESS_NAME), _T("<Unknown Process>")); // // To-Do!!! // This should *NEVER* happen. How to handle this? // } // // Add debugger list to the list ctrl // AddDebuggersToListCtrl( hListCtrl); return TRUE; } case WM_COMMAND: { switch(wParam) { case IDC_BTN_RECOVER: { EndDialog(hDlg, IDC_BTN_RECOVER); return TRUE; } case IDC_BTN_TERMINATE: { EndDialog(hDlg, IDC_BTN_TERMINATE); return TRUE; } case IDC_BTN_DEBUG: { HWND hListCtrl = GetDlgItem(hDlg, IDC_LIST_DEBUGGER); int nSelectedItem = ListView_GetSelectionMark(hListCtrl); if (nSelectedItem >= 0) { TCHAR debugCmdFormat[MAX_PATH] = {0}; LVITEM lvItem = {0}; lvItem.mask = LVIF_TEXT; lvItem.iItem = nSelectedItem; lvItem.iSubItem = 0; lvItem.pszText = debugCmdFormat; lvItem.cchTextMax = MAX_PATH; if (ListView_GetItem(hListCtrl, &lvItem)) { if (_tcslen(debugCmdFormat) > 0) { TCHAR launchDebuggerCmd[MAX_PATH * 2] = {0}; _stprintf( launchDebuggerCmd, debugCmdFormat, sProcDbgData.processId, sProcDbgData.eventHandle); STARTUPINFO startupInfo; PROCESS_INFORMATION procInfo; ZeroMemory(&startupInfo, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); ZeroMemory(&procInfo, sizeof(procInfo)); BOOL bResult = CreateProcess( NULL, launchDebuggerCmd, NULL, NULL, TRUE, 0, NULL, NULL, &startupInfo, &procInfo); if (!bResult) { cdHandleError( hDlg, GetLastError(), _T("Unable to launch debugger.")); } else { ShowWindow(hDlg, SW_HIDE); if (sProcDbgData.eventHandle) { // // wait till either the actual debugger dies or it sets the event // This wait is necessary because if we exit before the debugger // got attached to the target. The target dies because it thinks // we are the debugger. // HANDLE waitHandle[2]; waitHandle[0] = sProcDbgData.eventHandle; waitHandle[1] = procInfo.hProcess; WaitForMultipleObjects(2, (const HANDLE *)&waitHandle, FALSE, INFINITE); } else { // // wait till either the actual debugger dies or 10 seconds are over // This wait is necessary because if we exit before the debugger // got attached to the target. The target dies because it thinks // we are the debugger. // WaitForSingleObject(procInfo.hProcess, 10000); } EndDialog(hDlg, IDC_BTN_DEBUG); return FALSE; } } } } break; } case IDC_BTN_ADD_DEBUGGER: { TCHAR tempFileName[MAX_PATH]; tempFileName[0] = 0; OPENFILENAME ofn = {0}; ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; ofn.hwndOwner = hDlg; ofn.hInstance = ghInstance; ofn.lpstrFilter = _T("Executable (*.exe)\0*.exe\0\0"); ofn.lpstrFile = tempFileName; ofn.nMaxFile = MAX_PATH; ofn.lpstrTitle = _T("Select a debugger"); ofn.Flags = OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_PATHMUSTEXIST; if (GetOpenFileName(&ofn)) { DEBUGGER_INFO debuggerInfo; debuggerInfo.debuggerPath = ofn.lpstrFile; debuggerInfo.cmdLine = _T("-p %ld -e %ld"); DialogBoxParam( ghInstance, MAKEINTRESOURCE(IDD_DIALOG_ADD_DEBUGGER), hDlg, (DLGPROC)DebuggerDataDlgProc, (LPARAM)&debuggerInfo); tstring debuggerCmd = _T("\"") + debuggerInfo.debuggerPath + _T("\" ") + debuggerInfo.cmdLine; AddDebuggerToRegistry(hDlg, debuggerCmd); AddDebuggersToListCtrl(GetDlgItem(hDlg, IDC_LIST_DEBUGGER)); } break; } case IDC_BTN_MODIFY_DEBUGGER: { HWND hListCtrl = GetDlgItem(hDlg, IDC_LIST_DEBUGGER); int nSelectedItem = ListView_GetSelectionMark(hListCtrl); if (nSelectedItem >= 0) { TCHAR debugCmdLine[MAX_PATH] = {0}; LVITEM lvItem = {0}; lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.iItem = nSelectedItem; lvItem.iSubItem = 0; lvItem.pszText = debugCmdLine; lvItem.cchTextMax = MAX_PATH; if (ListView_GetItem(hListCtrl, &lvItem)) { LPARAM regIndex = lvItem.lParam; if (_tcslen(debugCmdLine) > 0) { DEBUGGER_INFO debuggerInfo; debuggerInfo.cmdLine = debugCmdLine; DialogBoxParam( ghInstance, MAKEINTRESOURCE(IDD_DIALOG_MODIFY_DEBUGGER), hDlg, (DLGPROC)DebuggerDataDlgProc, (LPARAM)&debuggerInfo); if (_tcscmp(debugCmdLine, debuggerInfo.cmdLine.c_str()) != 0) { // // Modify the particular registry entry // TCHAR valueName[32]; _stprintf(valueName, _T("Debugger%02d"), regIndex); int nReturnValue = 0; HKEY hAppDebuggerKey = NULL; nReturnValue = RegOpenKey( HKEY_LOCAL_MACHINE, REG_APP_ROOT REG_APP_DEBUGGERS, &hAppDebuggerKey); if (hAppDebuggerKey) { if (RegSetValueEx( hAppDebuggerKey, valueName, 0, REG_SZ, (LPBYTE)debuggerInfo.cmdLine.c_str(), (DWORD)(debuggerInfo.cmdLine.length() * sizeof(TCHAR))) != ERROR_SUCCESS) { cdHandleError( hDlg, GetLastError(), _T("Modify Debugger Failed. Unable to update the registry key.")); } RegCloseKey(hAppDebuggerKey); AddDebuggersToListCtrl(GetDlgItem(hDlg, IDC_LIST_DEBUGGER)); } else { cdHandleError( hDlg, GetLastError(), _T("Modify Debugger Failed. Unable to open required registry key.")); } } } } } break; } case IDC_BTN_DELETE_DEBUGGER: { HWND hListCtrl = GetDlgItem(hDlg, IDC_LIST_DEBUGGER); int nSelectedItem = ListView_GetSelectionMark(hListCtrl); if (nSelectedItem >= 0) { TCHAR debugCmdLine[MAX_PATH] = {0}; LVITEM lvItem = {0}; lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.iItem = nSelectedItem; lvItem.iSubItem = 0; lvItem.pszText = debugCmdLine; lvItem.cchTextMax = MAX_PATH; if (ListView_GetItem(hListCtrl, &lvItem)) { LPARAM regIndex = lvItem.lParam; // // Modify the particular registry entry // TCHAR valueName[32]; _stprintf(valueName, _T("Debugger%02d"), regIndex); int nReturnValue = 0; HKEY hAppDebuggerKey = NULL; nReturnValue = RegOpenKey( HKEY_LOCAL_MACHINE, REG_APP_ROOT REG_APP_DEBUGGERS, &hAppDebuggerKey); if (hAppDebuggerKey) { if (RegDeleteValue( hAppDebuggerKey, valueName) != ERROR_SUCCESS) { cdHandleError( hDlg, GetLastError(), _T("Delete Debugger Failed. Unable to delete the registry key.")); } RegCloseKey(hAppDebuggerKey); AddDebuggersToListCtrl(GetDlgItem(hDlg, IDC_LIST_DEBUGGER)); } else { cdHandleError( hDlg, GetLastError(), _T("Delete Debugger Failed. Unable to open required registry key.")); } } } break; } // // Don't allow closing from the title bar button. // /* case IDCANCEL: { EndDialog(hDlg, IDCANCEL); return TRUE; } */ } break; } case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam; HWND hwndCtl = (HWND)lParam; if (hwndCtl == GetDlgItem(hDlg, IDC_EDIT_PROCESS_NAME)) { if (SetTextColor(hdc, RGB(255, 0, 0)) == CLR_INVALID) { cdHandleError(hDlg, GetLastError(), _T("Failed to set control color")); break; } SetBkMode(hdc, TRANSPARENT); SetBkColor(hdc, GetSysColor(COLOR_WINDOW)); SelectObject(hdc, GetSysColorBrush(COLOR_WINDOW)); return TRUE; } break; } case WM_DESTROY: { return TRUE; } case WM_CLOSE: { break; } } // // Not handled by us // return FALSE; }
BOOL CALLBACK ReadMailDialogProc(HWND hDlg, UINT message, UINT wParam, LONG lParam) { static HWND hEdit, hList; static int mail_index; /* Number of currently displayed message, -1 if none */ MailHeader *header; int index, msg_num, count; char str[MAX_HEADERLINE], msg[MAXMAIL]; MINMAXINFO *lpmmi; LV_COLUMN lvcol; LV_ITEM lvitem; LV_HITTESTINFO lvhit; NM_LISTVIEW *nm; switch (message) { case WM_INITDIALOG: CenterWindow(hDlg, cinfo->hMain); hReadMailDlg = hDlg; hEdit = GetDlgItem(hDlg, IDC_MAILEDIT); hList = GetDlgItem(hDlg, IDC_MAILLIST); SendMessage(hDlg, BK_SETDLGFONTS, 0, 0); ListView_SetExtendedListViewStyleEx(hList, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); /* Store dialog rectangle in case of resize */ GetWindowRect(hDlg, &dlg_rect); // Add column headings lvcol.mask = LVCF_TEXT | LVCF_WIDTH; lvcol.pszText = GetString(hInst, IDS_MHEADER1); lvcol.cx = 25; ListView_InsertColumn(hList, 0, &lvcol); lvcol.pszText = GetString(hInst, IDS_MHEADER2); lvcol.cx = 80; ListView_InsertColumn(hList, 1, &lvcol); lvcol.pszText = GetString(hInst, IDS_MHEADER3); lvcol.cx = 150; ListView_InsertColumn(hList, 2, &lvcol); lvcol.pszText = GetString(hInst, IDS_MHEADER4); lvcol.cx = 135; ListView_InsertColumn(hList, 3, &lvcol); mail_index = -1; SetFocus(hReadMailDlg); MailGetMessageList(); RequestReadMail(); return TRUE; case WM_SIZE: ResizeDialog(hDlg, &dlg_rect, mailread_controls); return TRUE; case WM_GETMINMAXINFO: lpmmi = (MINMAXINFO *) lParam; lpmmi->ptMinTrackSize.x = 200; lpmmi->ptMinTrackSize.y = 300; return 0; case WM_ACTIVATE: if (wParam == 0) *cinfo->hCurrentDlg = NULL; else *cinfo->hCurrentDlg = hDlg; return TRUE; case BK_SETDLGFONTS: SetWindowFont(hEdit, GetFont(FONT_MAIL), TRUE); SetWindowFont(hList, GetFont(FONT_MAIL), TRUE); return TRUE; case BK_SETDLGCOLORS: ListView_SetTextColor(hList, GetColor(COLOR_LISTFGD)); ListView_SetBkColor(hList, GetColor(COLOR_LISTBGD)); InvalidateRect(hDlg, NULL, TRUE); return TRUE; case EN_SETFOCUS: /* By default, whole message becomes selected for some reason */ Edit_SetSel(hEdit, -1, 0); break; case BK_NEWMAIL: /* wParam = message number, lParam = message header string */ msg_num = wParam; header = (MailHeader *) lParam; // Add message to list view sprintf(str, "%d", msg_num); lvitem.mask = LVIF_TEXT | LVIF_PARAM; lvitem.iItem = 0; lvitem.iSubItem = 0; lvitem.pszText = str; lvitem.lParam = msg_num; ListView_InsertItem(hList, &lvitem); // Add subitems lvitem.mask = LVIF_TEXT; lvitem.iSubItem = 1; lvitem.pszText = header->sender; ListView_SetItem(hList, &lvitem); lvitem.iSubItem = 2; lvitem.pszText = header->subject; ListView_SetItem(hList, &lvitem); lvitem.iSubItem = 3; lvitem.pszText = header->date; ListView_SetItem(hList, &lvitem); // Erase message in status area SetDlgItemText(hDlg, IDC_MAILINFO, ""); return TRUE; case BK_NONEWMAIL: SetDlgItemText(hDlg, IDC_MAILINFO, GetString(hInst, IDS_NONEWMAIL)); return TRUE; HANDLE_MSG(hDlg, WM_CTLCOLOREDIT, MailCtlColor); HANDLE_MSG(hDlg, WM_CTLCOLORLISTBOX, MailCtlColor); HANDLE_MSG(hDlg, WM_CTLCOLORSTATIC, MailCtlColor); HANDLE_MSG(hDlg, WM_CTLCOLORDLG, MailCtlColor); HANDLE_MSG(hDlg, WM_INITMENUPOPUP, InitMenuPopupHandler); case WM_CLOSE: SendMessage(hDlg, WM_COMMAND, IDCANCEL, 0); return TRUE; case WM_DESTROY: hReadMailDlg = NULL; if (exiting) PostMessage(cinfo->hMain, BK_MODULEUNLOAD, 0, MODULE_ID); return TRUE; case WM_NOTIFY: if (wParam != IDC_MAILLIST) return TRUE; nm = (NM_LISTVIEW *) lParam; switch (nm->hdr.code) { case NM_CLICK: // If you click on an item, select it--why doesn't control work this way by default? GetCursorPos(&lvhit.pt); ScreenToClient(hList, &lvhit.pt); lvhit.pt.x = 10; index = ListView_HitTest(hList, &lvhit); if (index == -1) break; ListView_SetItemState(hList, index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); break; case LVN_ITEMCHANGED: // New item selected; get its message number lvitem.mask = LVIF_STATE | LVIF_PARAM; lvitem.stateMask = LVIS_SELECTED; lvitem.iItem = nm->iItem; lvitem.iSubItem = 0; ListView_GetItem(hList, &lvitem); if (!(lvitem.state & LVIS_SELECTED)) break; msg_num = lvitem.lParam; if (msg_num == mail_index) break; if (MailLoadMessage(msg_num, MAXMAIL, msg) == False) { ClientError(hInst, hReadMailDlg, IDS_CANTLOADMSG); break; } mail_index = msg_num; Edit_SetText(hEdit, msg); break; } return TRUE; case WM_COMMAND: UserDidSomething(); switch(GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_DELETEMSG: if (!ListViewGetCurrentData(hList, &index, &msg_num)) return TRUE; if (MailDeleteMessage(msg_num) == True) { /* Display new current message, if any */ Edit_SetText(hEdit, ""); ListView_DeleteItem(hList, index); count = ListView_GetItemCount(hList); if (count == 0) return TRUE; index = min(index, count - 1); // in case last message deleted ListView_SetItemState(hList, index, LVIS_SELECTED, LVIS_SELECTED); } return TRUE; case IDC_RESCAN: SetDlgItemText(hDlg, IDC_MAILINFO, GetString(hInst, IDS_GETTINGMSGS)); RequestReadMail(); return TRUE; case IDC_SEND: UserSendMail(); return TRUE; case IDC_REPLY: case IDC_REPLYALL: /* Find message number for currently selected message */ if (!ListViewGetCurrentData(hList, &index, &msg_num)) return TRUE; UserMailReply(msg_num, (Bool) (GET_WM_COMMAND_ID(wParam, lParam) == IDC_REPLYALL)); return TRUE; case IDCANCEL: /* Note: This code is also used by the WM_CLOSE message */ MailDeleteMessageList(); DestroyWindow(hDlg); return TRUE; } break; } return FALSE; }
static INT_PTR CALLBACK ConsoleDlgProc(HWND hwndDlg,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_INITDIALOG: { TCHAR title[MAX_PATH]; TCHAR name[MAX_PATH] = {0}; TCHAR path[MAX_PATH] = {0}; hTabs = GetDlgItem(hwndDlg, IDC_TABS); //TabCtrl_SetMinTabWidth(hTabs, 100); // restore position Utils_RestoreWindowPositionEx(hwndDlg,RWPF_HIDDEN,NULL,"Console","Console"); CallService(MS_DB_GETPROFILENAMET,(WPARAM)SIZEOF(name),(LPARAM)name); CallService(MS_DB_GETPROFILEPATHT,(WPARAM)SIZEOF(path),(LPARAM)path); mir_sntprintf(title, SIZEOF(title), _T("%s - %s\\%s"), TranslateT("Miranda Console"), path, name); SetWindowText(hwndDlg, title); SendMessage(hwndDlg,WM_SETICON,ICON_BIG,(LPARAM)hIcons[0]); hwndConsole = hwndDlg; SendMessage(hwndDlg, HM_ADD, 0, 0); PostMessage(hwndDlg, WM_SIZE, 0, 0); break; } case HM_DUMP: { // lParam = DUMPMSG int idx; LOGWIN *lw; LOGWIN lw2; DUMPMSG *dumpMsg = (DUMPMSG*)lParam; if (!pActive) { mir_free(dumpMsg); break; } if (!gSingleMode) { lw2.Module = dumpMsg->szModule; if (!List_GetIndex(&lModules, &lw2, &idx)) SendMessage(hwndDlg, HM_ADD, (WPARAM)idx, (LPARAM)dumpMsg->szModule); lw = (LOGWIN*)lModules.items[idx]; } else lw = pActive; if (lw->hwnd) SendMessage(lw->hwnd, HM_DUMP, wParam, lParam); else PostMessage(hwndDlg, HM_DUMP, wParam, lParam); // loop msg until window will be ready return TRUE; } case HM_ADD: { // wParam = index, lParam = module name LOGWIN *lw; COLORREF col; TCITEM tci = {0}; int idx = (int)wParam; char *str = (char*)lParam; if (!str) str = ""; // startup window lw = (LOGWIN*)mir_calloc( sizeof(LOGWIN)); lw->Module = (char*)mir_strdup(str); List_Insert(&lModules, lw, idx); if (!gSingleMode && lParam) { tci.mask = TCIF_PARAM | TCIF_TEXT; tci.lParam = (LPARAM)lw; tci.pszText = mir_a2u(lw->Module); idx = TabCtrl_InsertItem(hTabs, tabCount, &tci); mir_free(tci.pszText); tabCount++; } GetClientRect(hTabs, &rcTabs); TabCtrl_AdjustRect(hTabs, FALSE, &rcTabs); CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_LOG), hwndDlg, LogDlgProc, (LPARAM)lw); ShowWindow(lw->hwnd, (tabCount > 1)?SW_HIDE:SW_SHOWNOACTIVATE); if (pActive) { col = ListView_GetBkColor(pActive->hList); ListView_SetBkColor(lw->hList, col); ListView_SetTextBkColor(lw->hList, col); col = ListView_GetTextColor(pActive->hList); ListView_SetTextColor(lw->hList, col); if (hfLogFont) SendMessage(lw->hList, WM_SETFONT, (WPARAM)hfLogFont, TRUE); } // hide startup window if (tabCount == 1) { ShowWindow(pActive->hwnd, SW_HIDE); PostMessage(pActive->hwnd, WM_CLOSE, 0, 0); pActive = lw; } if (!pActive) pActive = lw; return TRUE; } case HM_REMOVE: { // lParam = LOGWIN LOGWIN *lw = (LOGWIN*)lParam; if (!lw) break; if (lw == pActive) { int tab = TabCtrl_GetCurSel(hTabs); if (tab >= 0) { TCITEM tci={0}; TabCtrl_DeleteItem(hTabs, tab); tabCount--; if (tabCount) { tab--; if (tab < 0 ) tab = 0; TabCtrl_SetCurSel(hTabs, tab); tci.mask = TCIF_PARAM; TabCtrl_GetItem(hTabs, tab, &tci); pActive = (LOGWIN*)tci.lParam; SendMessage(pActive->hwnd, WM_SIZE, 0, 0); ScrollDown(pActive); ShowWindow(pActive->hwnd, SW_SHOWNOACTIVATE); SetFocus(pActive->hList); } else pActive = NULL; } } List_RemovePtr(&lModules, lw); mir_free(lw->Module); mir_free(lw); return TRUE; } case HM_SETFONT: { // wParam = font, lParam = font color int i; LOGWIN *lw; for ( i = 0; i < lModules.realCount; i++ ) { lw = (LOGWIN*)lModules.items[i]; ListView_SetTextColor(lw->hList, (COLORREF)lParam); if (wParam) SendMessage(lw->hList, WM_SETFONT, wParam, TRUE); } return TRUE; } case HM_SETCOLOR: { // wParam = font, lParam = background color int i; LOGWIN *lw; for ( i = 0; i < lModules.realCount; i++ ) { lw = (LOGWIN*)lModules.items[i]; ListView_SetBkColor(lw->hList, (COLORREF)lParam); ListView_SetTextBkColor(lw->hList, (COLORREF)lParam); if (wParam) SendMessage(lw->hList, WM_SETFONT, wParam, TRUE); } return TRUE; } case HM_PAUSEALL: { // lParam = 1 to pause, 0 to start int i; LOGWIN *lw; for ( i = 0; i < lModules.realCount; i++ ) { lw = (LOGWIN*)lModules.items[i]; if (lw->Paused != (int)lParam) SendMessage(lw->hwnd, WM_COMMAND, IDC_PAUSE, 0); } return TRUE; } case HM_RESTART: { if (pActive) { pActive = NULL; PostMessage(hwndDlg, HM_RESTART, 0, 0); return TRUE; } // close all tabs if (!lParam) { LOGWIN *lw; TabCtrl_DeleteAllItems(hTabs); while ( lModules.realCount ) { lw = (LOGWIN*)lModules.items[0]; SendMessage(lw->hwnd, WM_CLOSE, 0, 0); } tabCount = 0; PostMessage(hwndDlg, HM_RESTART, 0, 1); return TRUE; } LoadSettings(); SendMessage(hwndDlg, HM_ADD, 0, 0); PostMessage(hwndDlg, WM_SIZE, 0, 0); return TRUE; } case WM_SETFOCUS: if (pActive) { SetFocus(pActive->hList); } return TRUE; case WM_NOTIFY: switch(wParam) { case IDC_TABS: { LPNMHDR lpnmhdr = (LPNMHDR)lParam; if (lpnmhdr->code == TCN_SELCHANGE) { int newTab = TabCtrl_GetCurSel(hTabs); if (newTab >= 0 ) { TCITEM tci={0}; HWND hOld = pActive->hwnd; tci.mask = TCIF_PARAM; if (!TabCtrl_GetItem(hTabs, newTab, &tci)) break; pActive = (LOGWIN*)tci.lParam; SendMessage(pActive->hwnd, WM_SIZE, 0, 0); ScrollDown(pActive); ShowWindow(hOld, SW_HIDE); ShowWindow(pActive->hwnd, SW_SHOWNOACTIVATE); SetFocus(pActive->hList); } else SendMessage(pActive->hwnd, WM_SIZE, 0, 0); } break; } } break; case WM_SIZE: { UTILRESIZEDIALOG urd={0}; urd.cbSize=sizeof(urd); urd.hInstance=hInst; urd.hwndDlg=hwndDlg; urd.lpTemplate=MAKEINTRESOURCEA(IDD_CONSOLE); urd.pfnResizer=ConsoleResize; CallService(MS_UTILS_RESIZEDIALOG,0,(LPARAM)&urd); GetClientRect(hTabs, &rcTabs); TabCtrl_AdjustRect(hTabs, FALSE, &rcTabs); if ( pActive ) SendMessage(pActive->hwnd, WM_SIZE, 0, 0); break; } case WM_GETMINMAXINFO: { MINMAXINFO *mmi=(MINMAXINFO*)lParam; mmi->ptMinTrackSize.x=400; mmi->ptMinTrackSize.y=200; break; } case WM_CLOSE: if ( lParam != 1 ) { Utils_SaveWindowPosition(hwndDlg,NULL,"Console","Console"); ShowConsole(0); return TRUE; } else DestroyWindow(hwndDlg); break; case WM_DESTROY: pActive = NULL; if (hfLogFont) DeleteObject(hfLogFont); PostQuitMessage(0); break; } return FALSE; }
// Re/initialize the ListControl Columns static void Picker_InternalResetColumnDisplay(HWND hWnd, BOOL bFirstTime) { LV_COLUMN lvc; int i = 0; int nColumn = 0; int *widths; int *order; int *shown; //int shown_columns; LVCOLUMN col; struct PickerInfo *pPickerInfo; HRESULT res = 0; BOOL b_res = 0; pPickerInfo = GetPickerInfo(hWnd); widths = (int*)malloc(pPickerInfo->nColumnCount * sizeof(*widths)); order = (int*)malloc(pPickerInfo->nColumnCount * sizeof(*order)); shown = (int*)malloc(pPickerInfo->nColumnCount * sizeof(*shown)); if (!widths || !order || !shown) goto done; memset(widths, 0, pPickerInfo->nColumnCount * sizeof(*widths)); memset(order, 0, pPickerInfo->nColumnCount * sizeof(*order)); memset(shown, 0, pPickerInfo->nColumnCount * sizeof(*shown)); pPickerInfo->pCallbacks->pfnGetColumnWidths(widths); pPickerInfo->pCallbacks->pfnGetColumnOrder(order); pPickerInfo->pCallbacks->pfnGetColumnShown(shown); if (!bFirstTime) { DWORD style = GetWindowLong(hWnd, GWL_STYLE); // switch the list view to LVS_REPORT style so column widths reported correctly SetWindowLong(hWnd, GWL_STYLE, (GetWindowLong(hWnd, GWL_STYLE) & ~LVS_TYPEMASK) | LVS_REPORT); // Retrieve each of the column widths i = 0; memset(&col, 0, sizeof(col)); col.mask = LVCF_WIDTH; while(ListView_GetColumn(hWnd, 0, &col)) { nColumn = Picker_GetRealColumnFromViewColumn(hWnd, i++); widths[nColumn] = col.cx; b_res = ListView_DeleteColumn(hWnd, 0); } pPickerInfo->pCallbacks->pfnSetColumnWidths(widths); // restore old style SetWindowLong(hWnd, GWL_STYLE, style); } nColumn = 0; for (i = 0; i < pPickerInfo->nColumnCount; i++) { if (shown[order[i]]) { lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvc.pszText = (LPTSTR) pPickerInfo->ppszColumnNames[order[i]]; lvc.iSubItem = nColumn; lvc.cx = widths[order[i]]; lvc.fmt = LVCFMT_LEFT; if (lvc.pszText[0] > 0) // column name cannot be blank { res = ListView_InsertColumn(hWnd, nColumn, &lvc); pPickerInfo->pnColumnsOrder[nColumn] = order[i]; //dprintf("Visible column %d: Logical column %d; Width=%d\n", nColumn, order[i], widths[order[i]]); nColumn++; } } } //shown_columns = nColumn; /* Fill this in so we can still sort on columns NOT shown */ for (i = 0; i < pPickerInfo->nColumnCount && nColumn < pPickerInfo->nColumnCount; i++) { if (!shown[order[i]]) { pPickerInfo->pnColumnsOrder[nColumn] = order[i]; nColumn++; } } if (GetListFontColor() == RGB(255, 255, 255)) b_res = ListView_SetTextColor(hWnd, RGB(240, 240, 240)); else b_res = ListView_SetTextColor(hWnd, GetListFontColor()); done: if (widths) free(widths); if (order) free(order); if (shown) free(shown); res++; b_res++; }
void ListView::SetTextColor(const uint color) const { ListView_SetTextColor( control, color ); }
void SetMenuListType(HWND hWnd, int how) { PNHMenuWindow data; RECT rt; DWORD dwStyles; char buf[BUFSZ]; TCHAR wbuf[BUFSZ]; int nItem; int i; HWND control; LVCOLUMN lvcol; LRESULT fnt; SIZE wnd_size; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); if( data->type != MENU_TYPE_MENU ) return; data->how = how; switch(how) { case PICK_NONE: dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_SINGLESEL; break; case PICK_ONE: dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_SINGLESEL; break; case PICK_ANY: dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_SINGLESEL; break; default: panic("how should be one of PICK_NONE, PICK_ONE or PICK_ANY"); }; if( strlen(data->menu.prompt)==0 ) { dwStyles |= LVS_NOCOLUMNHEADER ; } GetWindowRect(GetDlgItem(hWnd, IDC_MENU_LIST), &rt); DestroyWindow(GetDlgItem(hWnd, IDC_MENU_LIST)); control = CreateWindow(WC_LISTVIEW, NULL, dwStyles, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, hWnd, (HMENU)IDC_MENU_LIST, GetNHApp()->hApp, NULL ); if( !control ) panic( "cannot create menu control" ); /* install the hook for the control window procedure */ wndProcListViewOrig = (WNDPROC)GetWindowLong(control, GWL_WNDPROC); SetWindowLong(control, GWL_WNDPROC, (LONG)NHMenuListWndProc); /* set control font */ fnt = SendMessage(hWnd, WM_GETFONT, (WPARAM)0, (LPARAM)0); SendMessage(control, WM_SETFONT, (WPARAM)fnt, (LPARAM)0); /* set control colors */ ListView_SetBkColor(control, mswin_get_color(NHW_MENU, MSWIN_COLOR_BG)); ListView_SetTextBkColor(control, mswin_get_color(NHW_MENU, MSWIN_COLOR_BG)); ListView_SetTextColor(control, mswin_get_color(NHW_MENU, MSWIN_COLOR_FG)); /* add column to the list view */ mswin_menu_window_size(hWnd, &wnd_size); ZeroMemory(&lvcol, sizeof(lvcol)); lvcol.mask = LVCF_WIDTH | LVCF_TEXT; lvcol.cx = max( wnd_size.cx, GetSystemMetrics(SM_CXSCREEN)); lvcol.pszText = NH_A2W(data->menu.prompt, wbuf, BUFSZ); ListView_InsertColumn(control, 0, &lvcol); /* add items to the list view */ for(i=0; i<data->menu.size; i++ ) { LVITEM lvitem; ZeroMemory( &lvitem, sizeof(lvitem) ); sprintf(buf, "%c - %s", max(data->menu.items[i].accelerator, ' '), data->menu.items[i].str ); lvitem.mask = LVIF_PARAM | LVIF_STATE | LVIF_TEXT; lvitem.iItem = i; lvitem.iSubItem = 0; lvitem.state = data->menu.items[i].presel? LVIS_SELECTED : 0; lvitem.pszText = NH_A2W(buf, wbuf, BUFSZ); lvitem.lParam = (LPARAM)&data->menu.items[i]; nItem = SendMessage(control, LB_ADDSTRING, (WPARAM)0, (LPARAM) buf); if( ListView_InsertItem(control, &lvitem)==-1 ) { panic("cannot insert menu item"); } } SetFocus(control); }