void WinInitPicture (int size, int mode, int pr, int pg, int pb, int br, int bg, int bb, char *fname, int fstyle, int fsize, HRGN clipRgn, BOOL bDoubleBuffered, OSPictContext context ) { LOGBRUSH lb; LOGFONT lf; DWORD style; context->penSize = size; context->penPat = iBlackPattern; context->penMode = mode; context->penColor = RGB (pr, pg, pb); context->backColor = RGB (br, bg, bb); context->lastActivity = FILLING; if (bDoubleBuffered) { RECT clipRect; if (GetClipBox(context->hDC,&clipRect) == ERROR) { printf("osInitPicture -> GetClipBox failed\n"); exit(1); } context->hBufferedDC = context->hDC; context->hDC = CreateCompatibleDC(context->hBufferedDC); context->hBufferBitmap = CreateCompatibleBitmap(context->hBufferedDC,clipRect.right-clipRect.left,clipRect.bottom-clipRect.top); SelectObject(context->hDC, context->hBufferBitmap); if (!BitBlt(context->hDC, 0, 0, clipRect.right-clipRect.left, clipRect.bottom-clipRect.top, context->hBufferedDC, clipRect.left, clipRect.top, SRCCOPY)) { printf("osDonePicture -> BitBlt failed\n"); exit(1); } SetViewportOrgEx(context->hDC,-clipRect.left,-clipRect.top,NULL); } thePolygon = NULL; SetPolyFillMode (context->hDC, WINDING); strcpy (context->curFont, fname); context->fontstyle = fstyle; context->fontsize = PointsToPix(context->hDC,fsize); // PointsToPix by MW SetLogFontData (&lf, context->curFont, context->fontstyle, context->fontsize); if (context->penSize == 1) style = PS_COSMETIC | PS_SOLID; else style = PS_GEOMETRIC | PS_INSIDEFRAME; lb.lbStyle = BS_SOLID; lb.lbColor = context->penColor; lb.lbHatch = 0; context->theNormalPen = ExtCreatePen (style, context->penSize, &lb, 0, NULL); lb.lbStyle = BS_SOLID; lb.lbColor = context->backColor; lb.lbHatch = 0; context->theBackPen = ExtCreatePen (style, context->penSize, &lb, 0, NULL); SetBrushOrgEx (context->hDC,0,0,NULL); context->theNormalBrush = CreateSolidBrush (context->penColor); context->theBackBrush = CreateSolidBrush (context->backColor); context->theFont = CreateFontIndirect (&lf); SaveDC (context->hDC); SetWindowOrgEx (context->hDC, 0,0, NULL); SelectObject (context->hDC, GetStockObject (NULL_PEN)); SelectObject (context->hDC, context->theNormalBrush); SelectObject (context->hDC, context->theFont); SetBkMode (context->hDC, TRANSPARENT); SetBkColor (context->hDC, context->backColor); SetTextAlign (context->hDC, TA_LEFT | TA_BASELINE); WinSetMode (context->penMode, context); SetStretchBltMode (context->hDC,COLORONCOLOR); /* PA: when stretching bitmaps, use COLORONCOLOR mode. */ if (ghCaretWnd) { int mess, p1, p2, p3, p4, p5, p6; WinKickOsThread (CcRqHIDECARET, (int) ghCaretWnd, 0, 0, 0, 0, 0, &mess, &p1, &p2, &p3, &p4, &p5, &p6); } if (clipRgn != NULL) SelectClipRgn (context->hDC, clipRgn); } /* WinInitPicture */
static INT_PTR CALLBACK DlgProcUserDetails(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static char path[XFIRE_MAX_STATIC_STRING_LEN] = ""; static WCHAR wpath[256]; static HICON gameicon = 0; static HICON voiceicon = 0; static MCONTACT uhandle = 0; static HWND listbox; LVCOLUMNA pcol; switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); ghwndDlg = hwndDlg; listbox = GetDlgItem(hwndDlg, IDC_GAMEINFOLIST); pcol.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; pcol.pszText = "Key"; pcol.cx = 65; pcol.fmt = LVCFMT_LEFT; SendMessageA(listbox, LVM_INSERTCOLUMNA, 1, (LPARAM)&pcol); pcol.cx = 80; pcol.pszText = "Value"; SendMessageA(listbox, LVM_INSERTCOLUMNA, 2, (LPARAM)&pcol); HFONT hFont; LOGFONT lfFont; memset(&lfFont, 0x00, sizeof(lfFont)); memcpy(lfFont.lfFaceName, TEXT("Arial"), 8); lfFont.lfHeight = 13; lfFont.lfWeight = FW_BOLD; lfFont.lfCharSet = ANSI_CHARSET; lfFont.lfOutPrecision = OUT_DEFAULT_PRECIS; lfFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; lfFont.lfQuality = DEFAULT_QUALITY; // Create the font from the LOGFONT structure passed. hFont = CreateFontIndirect(&lfFont); SendMessageA(listbox, WM_SETFONT, (WPARAM)hFont, TRUE); return TRUE; } case WM_CTLCOLORSTATIC: { break; } case WM_NOTIFY: { switch (((LPNMHDR)lParam)->idFrom) { case 0: { switch (((LPNMHDR)lParam)->code) { case PSN_INFOCHANGED: { char* szProto; MCONTACT hContact = (MCONTACT)((LPPSHNOTIFY)lParam)->lParam; uhandle = hContact; //handle sichern if (hContact == NULL) szProto = protocolname; else szProto = GetContactProto(hContact); if (szProto == NULL) break; //alle items aus der liste entfernen SendMessage(listbox, LVM_DELETEALLITEMS, 0, 0); if (hContact) { DBVARIANT dbv; if (!db_get(hContact, protocolname, "Username", &dbv)) { int usernamesize = mir_strlen(dbv.pszVal) + 1; char* username = new char[usernamesize]; if (username) { strcpy_s(username, usernamesize, dbv.pszVal); mir_forkthread(LoadProfilStatus, (LPVOID)username); } //LoadProfilStatus db_free(&dbv); } if (!db_get(hContact, protocolname, "GameInfo", &dbv)) { setGameInfo(listbox, dbv.pszVal); db_free(&dbv); } addToList(listbox, hContact, "Servername", "ServerName"); addToList(listbox, hContact, "GameType", "GameType"); addToList(listbox, hContact, "Map", "Map"); addToList(listbox, hContact, "Players", "Players"); SetItemTxt(hwndDlg, IDC_DNICK, "Nick", hContact, 0); SetItemTxt(hwndDlg, IDC_DUSERNAME, "Username", hContact, 0); SetItemTxt(hwndDlg, IDC_GIP, "ServerIP", hContact, 0); SetItemTxt(hwndDlg, IDC_VIP, "VServerIP", hContact, 0); SetItemTxt(hwndDlg, IDC_GPORT, "Port", hContact, 1); SetItemTxt(hwndDlg, IDC_VPORT, "VPort", hContact, 1); SetItemTxt(hwndDlg, IDC_GAME, "RGame", hContact, 0); SetItemTxt(hwndDlg, IDC_VNAME, "RVoice", hContact, 0); //render icons { DBVARIANT dbv; if (!db_get(hContact, protocolname, "GameId", &dbv)) { SendDlgItemMessage(hwndDlg, IDC_GAMEICO, STM_SETICON, (WPARAM)xgamelist.iconmngr.getGameIcon(dbv.wVal), 0); db_free(&dbv); } if (!db_get(hContact, protocolname, "VoiceId", &dbv)) { SendDlgItemMessage(hwndDlg, IDC_VOICEICO, STM_SETICON, (WPARAM)xgamelist.iconmngr.getGameIcon(dbv.wVal), 0); db_free(&dbv); } if (db_get(hContact, protocolname, "ServerIP", &dbv)) { EnableWindow(GetDlgItem(hwndDlg, IDC_COPYGAME), FALSE); db_free(&dbv); } if (db_get(hContact, protocolname, "VServerIP", &dbv)) { EnableWindow(GetDlgItem(hwndDlg, IDC_COPYVOICE), FALSE); db_free(&dbv); } //ShowWindow(GetDlgItem(hwndDlg,IDC_VOICEICO),FALSE) } } } break; } } break; } } break; case WM_COMMAND: { switch (wParam) { case IDC_COPYGAME: GetIPPortUDetails(uhandle, "ServerIP", "Port"); break; case IDC_COPYVOICE: GetIPPortUDetails(uhandle, "VServerIP", "VPort"); break; } } } return FALSE; }
static BOOL internal_render_do_paint (SKINDATA* skind, HDC outhdc) { BUTTON *b; RECT *prt; int i; HDC thdc = skind->bmdc.hdc; // Create out temp dc if we haven't made it yet if (m_tempdc.hdc == NULL) { LOGFONT ft; m_tempdc.hdc = CreateCompatibleDC (thdc); m_tempdc.bm = CreateCompatibleBitmap (thdc, WIDTH (skind->background_rect), HEIGHT (skind->background_rect)); SelectObject (m_tempdc.hdc, m_tempdc.bm); // And the font memset (&ft, 0, sizeof(LOGFONT)); //strcpy(ft.lfFaceName, "Microsoft Sans pSerif"); strcpy (ft.lfFaceName, "Verdana"); ft.lfHeight = 12; m_tempfont = CreateFontIndirect(&ft); SelectObject (m_tempdc.hdc, m_tempfont); } // Do the background BitBlt (m_tempdc.hdc, 0, 0, WIDTH (skind->background_rect), HEIGHT (skind->background_rect), thdc, skind->background_rect.left, skind->background_rect.top, SRCCOPY); // Draw buttons for (i = 0; i < skind->m_num_buttons; i++) { b = &skind->m_buttons[i]; prt = &b->rt[b->mode]; BitBlt (m_tempdc.hdc, b->dest.left, b->dest.top, WIDTH(b->dest), HEIGHT(b->dest), thdc, prt->left, prt->top, SRCCOPY); } // Draw progress bar if (m_prog_on) { RECT rt = {m_prog_point.x, m_prog_point.y, m_prog_point.x + (WIDTH(m_prog_rect)*15) + 11, // yummy magic numbers m_prog_point.y + HEIGHT(m_prog_rect)+4}; time_t now; int num_bars; int i; time(&now); num_bars = (now-m_time_start) % 15; // number of bars to draw FrameRect (m_tempdc.hdc, &rt, skind->hbrush); for(i = 0; i < num_bars; i++) { BitBlt (m_tempdc.hdc, rt.left + (i * (WIDTH(m_prog_rect)+1)+2), rt.top+2, WIDTH(m_prog_rect), HEIGHT(m_prog_rect), thdc, m_prog_rect.left, m_prog_rect.top, SRCCOPY); } } // Draw text data on the screen SetBkMode (m_tempdc.hdc, TRANSPARENT); // Draw text SetTextColor (m_tempdc.hdc, skind->textcolor); for (i = 0; i < IDR_NUMFIELDS; i++) { TrimTextOut (m_tempdc.hdc, m_ddinfo[i].rt.left, m_ddinfo[i].rt.top, WIDTH(m_ddinfo[i].rt), m_ddinfo[i].str); } debug_printf ("bltting: (%d %d)\n", WIDTH (skind->background_rect), HEIGHT (skind->background_rect)); // Onto the actual screen BitBlt (outhdc, 0, 0, WIDTH (skind->background_rect), HEIGHT (skind->background_rect), m_tempdc.hdc, 0, 0, SRCCOPY); debug_printf ("bltting complete\n"); return TRUE; }
INT_PTR CALLBACK OptionsProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) { switch(msg){ case WM_INITDIALOG:{ DWORD style; g_opHdlg=hdlg; bOptionsInit=TRUE; TranslateDialogDefault(hdlg); if(g_iButtonsCount!=db_get_b(NULL, PLGNAME,"ButtonsCount", 0)) { LOGFONT logFont; HFONT hFont; bNeedRestart=TRUE; EnableWindow(GetDlgItem(hdlg,IDC_BUTTONSLIST),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_BLISTADD),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_BLISTREMOVE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_MENUTREE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_MTREEADD),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_MTREEREMOVE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_BUTTONNAME),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_MENUNAME),FALSE); ShowWindow(GetDlgItem(hdlg,IDC_WARNING),SW_SHOW); hFont = (HFONT)SendDlgItemMessage(hdlg, IDC_WARNING, WM_GETFONT, 0, 0); GetObject(hFont, sizeof(logFont), &logFont); logFont.lfWeight = FW_BOLD; hFont = CreateFontIndirect(&logFont); SendDlgItemMessage(hdlg, IDC_WARNING, WM_SETFONT, (WPARAM)hFont, 0); break; } g_iOPButtonsCount=g_iButtonsCount; hButtonsList=GetDlgItem(hdlg,IDC_BUTTONSLIST); hMenuTree=GetDlgItem(hdlg,IDC_MENUTREE); style = GetWindowLongPtr(hButtonsList,GWL_STYLE); style |=TVS_NOHSCROLL; SetWindowLongPtr(hButtonsList,GWL_STYLE, style); style = GetWindowLongPtr(hMenuTree,GWL_STYLE); style |=TVS_NOHSCROLL; SetWindowLongPtr(hMenuTree,GWL_STYLE, style); BuildButtonsList(hButtonsList); if (!TreeView_GetCount(hButtonsList)) EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),FALSE); mir_subclassWindow( GetDlgItem(hdlg,IDC_BUTTONNAME), EditSubclassProc); mir_subclassWindow( GetDlgItem(hdlg,IDC_MENUNAME), EditSubclassProc); EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); CheckDlgButton(hdlg,IDC_RAUTOSEND,(g_bRClickAuto=db_get_b(NULL,PLGNAME,"RClickAuto",0)) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hdlg,IDC_LAUTOSEND,(g_bLClickAuto=db_get_b(NULL,PLGNAME,"LClickAuto",0)) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hdlg,IDC_ENABLEQUICKMENU,(g_bQuickMenu=db_get_b(NULL, PLGNAME,"QuickMenu", 1)) ? BST_CHECKED : BST_UNCHECKED); bOptionsInit=FALSE; }break; case WM_LBUTTONUP: if(drag) { TVHITTESTINFO hti; HTREEITEM htiAfter=NULL; ButtonData* bd=NULL; TVITEM tvi; RECT rc; BYTE height; BOOLEAN bAsChild = FALSE; TreeView_SetInsertMark(hMenuTree, NULL, 0 ); ReleaseCapture(); SetCursor( LoadCursor( NULL, IDC_ARROW )); hti.pt.x = ( SHORT )LOWORD( lparam ); hti.pt.y = ( SHORT )HIWORD( lparam ); ClientToScreen(hdlg,&hti.pt); ScreenToClient(hMenuTree,&hti.pt); TreeView_HitTest( hMenuTree, &hti ); if(TreeView_GetParent(hMenuTree,hti.hItem)&&TreeView_GetChild(hMenuTree,hDragItem)) break; if(TreeView_GetChild(hMenuTree,hti.hItem)&&TreeView_GetChild(hMenuTree,hDragItem)) break; if ( hti.flags & TVHT_ABOVE ) { htiAfter = TVI_FIRST; } else if ( hti.flags & ( TVHT_NOWHERE|TVHT_BELOW )) { htiAfter = TVI_LAST; } else if ( hti.flags & ( TVHT_ONITEM|TVHT_ONITEMRIGHT )) { // check where over the item, the pointer is if ( !TreeView_GetItemRect( hMenuTree, hti.hItem, &rc, FALSE )) { drag=0; break; } height = ( BYTE )( rc.bottom - rc.top ); if ( hti.pt.y - ( height / 3 ) < rc.top ) { HTREEITEM hItem = hti.hItem; if ( !( hti.hItem = TreeView_GetPrevSibling( hMenuTree, hItem )) ) { if ( !( hti.hItem = TreeView_GetParent(hMenuTree, hItem ))) htiAfter = TVI_FIRST; else bAsChild = TRUE; } } else if ( hti.pt.y + ( height / 3 ) <= rc.bottom ) { bAsChild = TRUE; } } if(TreeView_GetChild(hMenuTree,hDragItem)&&bAsChild) break; if(hti.hItem){ tvi.hItem=hti.hItem; tvi.mask=TVIF_PARAM |TVIF_HANDLE; TreeView_GetItem(hMenuTree,&tvi); if ((bd=(ButtonData*)tvi.lParam)&&(bd->fEntryOpType&QMF_EX_SEPARATOR)) bAsChild = FALSE; } if(TreeView_GetParent(hMenuTree,hti.hItem)) bAsChild = FALSE; MoveItem( hDragItem, htiAfter?htiAfter:hti.hItem, bAsChild ); SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); drag=0; } break; /////////////////////////////////// //From UserInfoEx by DeathAxe // case WM_MOUSEMOVE: { if (!drag) break; { TVHITTESTINFO hti; hti.pt.x=(short)LOWORD(lparam); hti.pt.y=(short)HIWORD(lparam); ClientToScreen(hdlg,&hti.pt); ScreenToClient(hMenuTree,&hti.pt); TreeView_HitTest(hMenuTree,&hti); if ( hti.flags & ( TVHT_ONITEM|TVHT_ONITEMRIGHT )) { RECT rc; BYTE height; if ( TreeView_GetItemRect(hMenuTree, hti.hItem, &rc, FALSE )) { height = ( BYTE )( rc.bottom - rc.top ); if ( hti.pt.y - ( height / 3 ) < rc.top ) { SetCursor( LoadCursor( NULL, IDC_ARROW )); TreeView_SetInsertMark( hMenuTree, hti.hItem, 0 ); } else if ( hti.pt.y + ( height / 3 ) > rc.bottom ) { SetCursor( LoadCursor( NULL, IDC_ARROW )); TreeView_SetInsertMark( hMenuTree, hti.hItem, 1 ); } else { TreeView_SetInsertMark( hMenuTree, NULL, 0 ); SetCursor( LoadCursor( GetModuleHandle(NULL), MAKEINTRESOURCE( 183 )) ); } } } else { if ( hti.flags & TVHT_ABOVE ) SendMessage( hMenuTree, WM_VSCROLL, MAKEWPARAM( SB_LINEUP, 0 ), 0 ); if ( hti.flags & TVHT_BELOW ) SendMessage( hMenuTree, WM_VSCROLL, MAKEWPARAM( SB_LINEDOWN, 0 ), 0 ); TreeView_SetInsertMark( hMenuTree, NULL, 0 ); } } }break; ///////////// case WM_DESTROY: if (g_varhelpDlg) DestroyWindow(g_varhelpDlg); g_varhelpDlg=NULL; break; case WM_NOTIFY: switch(((LPNMHDR)lparam)->idFrom) { case 0: if (((LPNMHDR)lparam)->code == PSN_APPLY ) { if (!bNeedRestart){ SetMenuEntryProperties(hdlg); SaveMenuTree(hdlg); } db_set_b(NULL,PLGNAME,"RClickAuto",(BYTE)(g_bRClickAuto=IsDlgButtonChecked(hdlg,IDC_RAUTOSEND))); db_set_b(NULL,PLGNAME,"LClickAuto",(BYTE)(g_bLClickAuto=IsDlgButtonChecked(hdlg,IDC_LAUTOSEND))); db_set_b(NULL,PLGNAME,"QuickMenu",(BYTE)(g_bQuickMenu=IsDlgButtonChecked(hdlg,IDC_ENABLEQUICKMENU))); return 1; } else if (((LPNMHDR)lparam)->code == PSN_RESET ) { if (!bNeedRestart) RestoreModuleData(hdlg); return 1; } break; case IDC_MENUTREE: switch (((LPNMHDR)lparam)->code){ case TVN_KEYDOWN:{ TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*) ((LPNMHDR)lparam); if ( pTVKeyDown->wVKey == VK_F2 ) TreeView_EditLabel(hMenuTree,TreeView_GetSelection(hMenuTree)); else if ( pTVKeyDown->wVKey == VK_DELETE ) SendMessage(hdlg,WM_COMMAND,IDC_MTREEREMOVE,0); }break; case TVN_BEGINLABELEDITA: case TVN_BEGINLABELEDITW: hwndEdit=TreeView_GetEditControl(hMenuTree); mir_subclassWindow(hwndEdit, LabelEditSubclassProc); break; case TVN_ENDLABELEDITA: case TVN_ENDLABELEDITW: { TVITEM tvi; ButtonData* bd=NULL; TCHAR strbuf[256]; TCHAR szLabel[256]; tvi.pszText = strbuf; tvi.cchTextMax = SIZEOF(strbuf); tvi.mask=TVIF_TEXT |TVIF_HANDLE|TVIF_PARAM; tvi.hItem=TreeView_GetSelection(hMenuTree); TreeView_GetItem(hMenuTree,&tvi); GetWindowText(hwndEdit, szLabel, SIZEOF(szLabel)); hwndEdit=NULL; if (!_tcslen(szLabel)) break; if (bd = (ButtonData*)tvi.lParam){ if (!_tcscmp(szLabel,_T("---"))) { if(TreeView_GetChild(hMenuTree,tvi.hItem)) break; else{ bd->fEntryOpType=QMF_EX_SEPARATOR; EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); } } else { bd->fEntryOpType&=~QMF_EX_SEPARATOR; EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),TRUE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),TRUE); SetDlgItemText(hdlg, IDC_MENUVALUE, bd->pszOpValue/*?bd->pszOpValue:bd->pszValue*/); } bd->pszOpName=mir_tstrdup(szLabel); tvi.pszText=szLabel; TreeView_SetItem(hMenuTree, &tvi); SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); } }break; case NM_KILLFOCUS: TreeView_EndEditLabelNow(hButtonsList, 1); break; case TVN_BEGINDRAGA: case TVN_BEGINDRAGW: SetCapture(hdlg); drag=1; hDragItem=((LPNMTREEVIEW)lparam)->itemNew.hItem; TreeView_SelectItem(hMenuTree,hDragItem); break; case TVN_SELCHANGINGA: case TVN_SELCHANGINGW: { TVITEM tvi; HTREEITEM hti; ButtonData* bd; hti=TreeView_GetSelection(hMenuTree); if (hti==NULL) break; tvi.hItem=hti; tvi.mask=TVIF_HANDLE|TVIF_PARAM; TreeView_GetItem(hMenuTree,&tvi); if (tvi.lParam == 0) break; bd = ( ButtonData* )tvi.lParam; if (bd) { TCHAR szValue[256]; GetDlgItemText(hdlg, IDC_MENUVALUE, szValue, SIZEOF(szValue)); if(_tcslen(szValue)) { if(bd->pszOpValue&&(bd->pszOpValue!=bd->pszValue)) mir_free(bd->pszOpValue); bd->pszOpValue=mir_tstrdup(szValue); } bd->bOpInQMenu=IsDlgButtonChecked(hdlg,IDC_INQMENU); bd->bIsOpServName=IsDlgButtonChecked(hdlg,IDC_ISSERVNAME); } }break; case TVN_SELCHANGEDA: case TVN_SELCHANGEDW: { TVITEM tvi; HTREEITEM hti; ButtonData* bd=NULL; hti=TreeView_GetSelection(hMenuTree); if (hti==NULL) break; tvi.mask=TVIF_HANDLE|TVIF_PARAM; tvi.hItem=hti; TreeView_GetItem(hMenuTree,&tvi); bd = ( ButtonData* )tvi.lParam; if (bd) { if (!TreeView_GetChild(hMenuTree, tvi.hItem)&&!(bd->fEntryOpType&QMF_EX_SEPARATOR)) { EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),TRUE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),TRUE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),TRUE); SetDlgItemText(hdlg, IDC_MENUVALUE, bd->pszOpValue/*?bd->pszOpValue:bd->pszValue*/); } else { EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); if (!(bd->fEntryOpType&QMF_EX_SEPARATOR)) EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); } CheckDlgButton(hdlg,IDC_INQMENU,bd->bOpInQMenu ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hdlg,IDC_ISSERVNAME,bd->bIsOpServName ? BST_CHECKED : BST_UNCHECKED); } } }break; case IDC_BUTTONSLIST: switch (((LPNMHDR)lparam)->code) { case TVN_KEYDOWN:{ TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*) ((LPNMHDR)lparam); if ( pTVKeyDown->wVKey == VK_F2 ) TreeView_EditLabel(hButtonsList,TreeView_GetSelection(hButtonsList)); else if ( pTVKeyDown->wVKey == VK_DELETE ) SendMessage(hdlg,WM_COMMAND,IDC_BLISTREMOVE,0); }break; case TVN_BEGINLABELEDITA: case TVN_BEGINLABELEDITW: hwndEdit = TreeView_GetEditControl(hButtonsList); mir_subclassWindow(hwndEdit, LabelEditSubclassProc); break; case TVN_ENDLABELEDITA: case TVN_ENDLABELEDITW: { TVITEM tvi; TCHAR strbuf[128]; TCHAR szLabel[128]; tvi.pszText = strbuf; tvi.cchTextMax = SIZEOF(strbuf); tvi.mask=TVIF_TEXT |TVIF_HANDLE|TVIF_PARAM; tvi.hItem=TreeView_GetSelection(hButtonsList); TreeView_GetItem(hButtonsList,&tvi); GetWindowText(hwndEdit, szLabel, SIZEOF(szLabel)); hwndEdit=NULL; if (!_tcslen(szLabel)) break; tvi.pszText=szLabel; ((ListData*)tvi.lParam)->dwOPFlags|=QMF_RENAMED; TreeView_SetItem(hButtonsList, &tvi); SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); }break; case TVN_SELCHANGINGA: case TVN_SELCHANGINGW: SetMenuEntryProperties(hdlg); break; case TVN_SELCHANGEDA: case TVN_SELCHANGEDW: { TVITEM tvi; HTREEITEM hti; hti=TreeView_GetSelection(hButtonsList); if(hti==NULL||!TreeView_GetCount(hButtonsList)) { EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME2),FALSE); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); break; } tvi.mask=TVIF_HANDLE|TVIF_PARAM; tvi.hItem=hti; TreeView_GetItem(hButtonsList,&tvi); if(tvi.lParam==0) break; BuildMenuTree(hMenuTree,(SortedList *)((ListData*)tvi.lParam)->sl); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),TRUE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME2),TRUE); CheckDlgButton(hdlg,IDC_ISSERVNAME2,((ListData*)tvi.lParam)->bIsOpServName ? BST_CHECKED : BST_UNCHECKED); if (((ListData*)tvi.lParam)->ptszOPQValue) SetDlgItemText(hdlg, IDC_RCLICKVALUE, ((ListData*)tvi.lParam)->ptszOPQValue); else SetDlgItemText(hdlg, IDC_RCLICKVALUE, _T("")); }break; }break; } break; case WM_COMMAND: switch(LOWORD(wparam)) { case IDC_VARHELP: if (!g_varhelpDlg) g_varhelpDlg=CreateDialog(hinstance,MAKEINTRESOURCE(IDD_HELPDIALOG), 0, HelpDlgProc); else //ShowWindow(g_varhelpDlg,SW_SHOWDEFAULT); SetWindowPos(g_varhelpDlg,0,0,0,0,0,SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE); break; case IDC_BLISTADD: { TVINSERTSTRUCT tvis; ListData* ld=NULL; TCHAR namebuff[MAX_PATH]={'\0'}; int count=TreeView_GetCount(hButtonsList); if (count>10) break; if(g_iOPButtonsCount==99){ MessageBox(NULL, TranslateT("Congratulation!\r\nYou have clicked this button 100 times!\r\nThere was access violation at this point...\r\nAnd now function for freeing resources must be called...\r\nBut no! there's only break :D"), TranslateT("You win!"),MB_OK); break; } ld = (ListData *)mir_alloc(sizeof(ListData)); ButtonsList[g_iOPButtonsCount++]=ld; ld->sl=List_Create(0,1); ld->dwOPFlags=QMF_NEW; ld->bIsOpServName=0; ld->ptszButtonName=NULL; ld->ptszOPQValue=NULL; ld->ptszQValue=NULL; tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; GetDlgItemText(hdlg, IDC_BUTTONNAME, namebuff, SIZEOF(namebuff)); tvis.item.mask=TVIF_PARAM|TVIF_TEXT; tvis.item.pszText=(_tcslen(namebuff))?namebuff:TranslateT("New Button"); tvis.item.lParam=(LPARAM)ld; TreeView_SelectItem(hButtonsList,TreeView_InsertItem(hButtonsList,&tvis)); }break; case IDC_BLISTREMOVE: { TVITEM tvi; ListData* ld; if (!(tvi.hItem=TreeView_GetSelection(hButtonsList))) break; tvi.mask=TVIF_HANDLE|TVIF_PARAM; TreeView_GetItem(hButtonsList,&tvi); ld= (ListData*)tvi.lParam; ld->dwOPFlags|=QMF_DELETNEEDED; TreeView_DeleteItem(hButtonsList,tvi.hItem); if (!TreeView_GetCount(hButtonsList)) { TreeView_DeleteAllItems(hMenuTree); EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME2),FALSE); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); SetDlgItemText(hdlg, IDC_RCLICKVALUE, _T("")); } }break; case IDC_MTREEADD: { TVINSERTSTRUCT tvis; TVITEM tvi; ButtonData *bd=NULL; SortedList *sl=NULL; TCHAR namebuff[MAX_PATH]={'\0'}; if (!TreeView_GetCount(hButtonsList)) break; if (!(tvi.hItem=TreeView_GetSelection(hButtonsList))) break; bd = (ButtonData *)mir_alloc(sizeof(ButtonData)); memset(bd,0,sizeof(ButtonData)); GetDlgItemText(hdlg, IDC_MENUNAME, namebuff, SIZEOF(namebuff)); bd->dwOPPos=TreeView_GetCount(hMenuTree)-1; bd->pszOpName=_tcslen(namebuff)?mir_tstrdup(namebuff):mir_tstrdup(TranslateT("New Menu Entry")); bd->pszOpValue=mir_tstrdup(bd->pszOpName); bd->fEntryOpType=!_tcscmp(namebuff,_T("---"))?QMF_EX_SEPARATOR:0; bd->dwOPFlags=QMF_NEW; bd->pszName=NULL; bd->pszValue=NULL; tvi.mask=TVIF_HANDLE|TVIF_PARAM; TreeView_GetItem(hButtonsList,&tvi); sl=((ListData*)tvi.lParam)->sl; List_InsertPtr(sl,bd); tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask=TVIF_PARAM|TVIF_TEXT; tvis.item.pszText=bd->pszOpName; tvis.item.lParam=(LPARAM)bd; TreeView_SelectItem(hMenuTree,TreeView_InsertItem(hMenuTree,&tvis)); }break; case IDC_MTREEREMOVE: { TVITEM tvi; TVINSERTSTRUCT tvis; HTREEITEM hti=NULL; ButtonData *bd=NULL; tvi.mask=TVIF_HANDLE|TVIF_PARAM; if (!(tvi.hItem=TreeView_GetSelection(hMenuTree))) break; TreeView_GetItem(hMenuTree,&tvi); hti=tvi.hItem; bd= (ButtonData*)tvi.lParam; bd->dwOPFlags|=QMF_DELETNEEDED; if(tvi.hItem=TreeView_GetChild(hMenuTree,tvi.hItem)) { TCHAR strbuf[128]; while(tvi.hItem){ tvis.hInsertAfter=hti; tvi.pszText = strbuf; tvi.cchTextMax = SIZEOF(strbuf); tvi.mask=TVIF_HANDLE|TVIF_PARAM|TVIF_TEXT; TreeView_GetItem(hMenuTree,&tvi); tvis.hParent=NULL; tvis.item=tvi; TreeView_InsertItem(hMenuTree,&tvis); tvi.hItem=TreeView_GetNextSibling(hMenuTree,tvi.hItem); } } TreeView_DeleteItem(hMenuTree,hti); if (!TreeView_GetCount(hMenuTree)) { EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); SetDlgItemText(hdlg, IDC_MENUVALUE, _T("")); } }break; } break; case WM_CLOSE: EndDialog(hdlg,0); return 0; } if (HIWORD(wparam)==BN_CLICKED && GetFocus()==(HWND)lparam) SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); else if ((HIWORD(wparam) == EN_CHANGE)&&(GetFocus()==(HWND)lparam)) if (!bOptionsInit) SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); return 0; }
/** * This is the message procedure for my nice looking message box * * @param hDlg - window handle * @param uMsg - message to handle * @param wParam - message specific parameter * @param lParam - message specific parameter * * @return TRUE, FALSE, IDOK, IDYES, IDALL, IDNO or IDCANCEL **/ static INT_PTR CALLBACK MsgBoxProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static int retOk = IDOK; static int retAll = IDALL; static int retNon = IDNONE; static int retCancel = IDCANCEL; switch (uMsg) { case WM_INITDIALOG: { LPMSGBOX pMsgBox = (LPMSGBOX)lParam; if (PtrIsValid(pMsgBox)) { int icoWidth = 0; int InfoBarHeight = 0; HFONT hNormalFont; hNormalFont = (HFONT)SendDlgItemMessage(hDlg, TXT_NAME, WM_GETFONT, 0, 0); if (pMsgBox->uType & MB_INFOBAR) { LOGFONT lf; // set bold font for name in description area GetObject(hNormalFont, sizeof(lf), &lf); lf.lfWeight = FW_BOLD; hNormalFont = CreateFontIndirect(&lf); // set infobar's textfont SendDlgItemMessage(hDlg, TXT_NAME, WM_SETFONT, (WPARAM)hNormalFont, 0); // set infobar's logo icon SendDlgItemMessage(hDlg, ICO_DLGLOGO, STM_SETIMAGE, IMAGE_ICON, (pMsgBox->hiLogo ? (LPARAM)pMsgBox->hiLogo : (LPARAM)IcoLib_GetIcon(ICO_DLG_DETAILS))); // enable headerbar ShowWindow(GetDlgItem(hDlg, TXT_NAME), SW_SHOW); ShowWindow(GetDlgItem(hDlg, ICO_DLGLOGO), SW_SHOW); } else { RECT rc; GetClientRect(GetDlgItem(hDlg, TXT_NAME), &rc); InfoBarHeight = rc.bottom; if (pMsgBox->hiLogo) SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)pMsgBox->hiLogo); } // draw the desired status icon HICON hIcon = MsgLoadIcon(pMsgBox); if (hIcon) SendDlgItemMessage(hDlg, ICO_MSGDLG, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); else { RECT ws; GetWindowRect(GetDlgItem(hDlg, ICO_MSGDLG), &ws); icoWidth = ws.right - ws.left; ShowWindow(GetDlgItem(hDlg, ICO_MSGDLG), SW_HIDE); } // resize the messagebox and reorganize the buttons if (HDC hDC = GetDC(hDlg)) { POINT mpt = { 0, 0 }; RECT ws = { 0, 0, 0, 0 }; int txtWidth = 0, txtHeight = 0, needX, needY; RECT rcDlg; SIZE ts; LPTSTR h, rs; SelectObject(hDC, hNormalFont); // get message text width and height if (pMsgBox->ptszMsg) for (rs = h = pMsgBox->ptszMsg;; ++h) { if (*h == '\n' || !*h) { GetTextExtentPoint32(hDC, rs, h - rs, &ts); if (ts.cx > txtWidth) txtWidth = ts.cx; txtHeight += ts.cy; if (!*h) break; rs = h + 1; } } // increase width if info text requires more if ((pMsgBox->uType&MB_INFOBAR) && pMsgBox->ptszInfoText && *pMsgBox->ptszInfoText) { int multiline = 0; RECT rcico; GetClientRect(GetDlgItem(hDlg, ICO_DLGLOGO), &rcico); rcico.right = rcico.right * 100 / 66; // padding for (rs = h = pMsgBox->ptszInfoText;; ++h) { if (*h == '\n' || !*h) { GetTextExtentPoint32(hDC, rs, h - rs, &ts); ts.cx += rcico.right; if (ts.cx > txtWidth) txtWidth = ts.cx; if (!*h) break; rs = h + 1; ++multiline; } } if (!multiline) SetWindowLongPtr(GetDlgItem(hDlg, TXT_NAME), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hDlg, TXT_NAME), GWL_STYLE) | SS_CENTERIMAGE); } ReleaseDC(hDlg, hDC); // calc new dialog size GetWindowRect(hDlg, &rcDlg); GetWindowRect(GetDlgItem(hDlg, TXT_MESSAGE), &ws); needX = txtWidth - (ws.right - ws.left) - icoWidth; needY = max(0, txtHeight - (ws.bottom - ws.top) + 5); rcDlg.left -= needX / 2; rcDlg.right += needX / 2; rcDlg.top -= (needY - InfoBarHeight) / 2; rcDlg.bottom += (needY - InfoBarHeight) / 2; // resize dialog window MoveWindow(hDlg, rcDlg.left, rcDlg.top, rcDlg.right - rcDlg.left, rcDlg.bottom - rcDlg.top, FALSE); ClientToScreen(hDlg, &mpt); MoveCtrl(hDlg, STATIC_WHITERECT, -mpt.x, -mpt.y, needX, needY - InfoBarHeight); MoveCtrl(hDlg, TXT_NAME, -mpt.x, -mpt.y, needX, 0); MoveCtrl(hDlg, ICO_DLGLOGO, -mpt.x + needX, -mpt.y, 0, 0); MoveCtrl(hDlg, ICO_MSGDLG, -mpt.x, -mpt.y - InfoBarHeight, 0, 0); MoveCtrl(hDlg, TXT_MESSAGE, -mpt.x - icoWidth, -mpt.y - InfoBarHeight, needX, needY); MoveCtrl(hDlg, STATIC_LINE2, -mpt.x, -mpt.y + needY - InfoBarHeight, needX, 0); // // Do pushbutton positioning // RECT rcOk, rcAll, rcNone, rcCancel; // get button rectangles GetWindowRect(GetDlgItem(hDlg, IDOK), &rcOk); OffsetRect(&rcOk, -mpt.x, -mpt.y + needY - InfoBarHeight); GetWindowRect(GetDlgItem(hDlg, IDALL), &rcAll); OffsetRect(&rcAll, -mpt.x, -mpt.y + needY - InfoBarHeight); GetWindowRect(GetDlgItem(hDlg, IDNONE), &rcNone); OffsetRect(&rcNone, -mpt.x, -mpt.y + needY - InfoBarHeight); GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &rcCancel); OffsetRect(&rcCancel, -mpt.x, -mpt.y + needY - InfoBarHeight); LONG okWidth = rcOk.right - rcOk.left; LONG allWidth = rcAll.right - rcAll.left; LONG noneWidth = rcNone.right - rcNone.left; LONG caWidth = rcCancel.right - rcCancel.left; LONG dlgMid = (rcDlg.right - rcDlg.left) / 2; // load button configuration switch (MB_TYPE(pMsgBox->uType)) { case MB_OK: rcOk.left = dlgMid - (okWidth / 2); rcOk.right = rcOk.left + okWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); break; case MB_OKCANCEL: retOk = IDRETRY; SetDlgItemText(hDlg, IDOK, LPGENT("OK")); retCancel = IDCANCEL; SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); rcOk.left = dlgMid - okWidth - 10; rcOk.right = rcOk.left + okWidth; rcCancel.left = dlgMid + 10; rcCancel.right = rcCancel.left + caWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; case MB_RETRYCANCEL: retOk = IDRETRY; SetDlgItemText(hDlg, IDOK, LPGENT("Retry")); retCancel = IDCANCEL; SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); rcOk.left = dlgMid - okWidth - 10; rcOk.right = rcOk.left + okWidth; rcCancel.left = dlgMid + 10; rcCancel.right = rcCancel.left + caWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; case MB_YESNO: retOk = IDYES; SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); retCancel = IDNO; SetDlgItemText(hDlg, IDCANCEL, LPGENT("No")); rcOk.left = dlgMid - okWidth - 10; rcOk.right = rcOk.left + okWidth; rcCancel.left = dlgMid + 10; rcCancel.right = rcCancel.left + caWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; case MB_ABORTRETRYIGNORE: retOk = IDABORT; SetDlgItemText(hDlg, IDOK, LPGENT("Abort")); retAll = IDABORT; SetDlgItemText(hDlg, IDALL, LPGENT("Retry")); retCancel = IDCANCEL; SetDlgItemText(hDlg, IDCANCEL, LPGENT("Ignore")); rcAll.left = dlgMid - (allWidth / 2); rcAll.right = rcAll.left + allWidth; rcOk.left = rcAll.left - okWidth - 5; rcOk.right = rcOk.left + okWidth; rcCancel.left = rcAll.right + 5; rcCancel.right = rcCancel.left + caWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; case MB_YESNOCANCEL: retOk = IDYES; SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); retAll = IDNO; SetDlgItemText(hDlg, IDALL, LPGENT("No")); retCancel = IDCANCEL; SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); rcAll.left = dlgMid - (allWidth / 2); rcAll.right = rcAll.left + allWidth; rcOk.left = rcAll.left - okWidth - 5; rcOk.right = rcOk.left + okWidth; rcCancel.left = rcAll.right + 5; rcCancel.right = rcCancel.left + caWidth; ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; case MB_YESALLNO: retOk = IDYES; SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); retAll = IDALL; SetDlgItemText(hDlg, IDALL, LPGENT("All")); //retNon = IDNONE; SetDlgItemText(hDlg, IDNONE, LPGENT("None")); retCancel = IDNO; SetDlgItemText(hDlg, IDCANCEL, LPGENT("No")); rcCancel.right = rcDlg.right - rcDlg.left - 10; rcCancel.left = rcCancel.right - caWidth; rcNone.right = rcCancel.left - 5; rcNone.left = rcNone.right - noneWidth; rcAll.right = rcNone.left - 5; rcAll.left = rcAll.right - allWidth; rcOk.right = rcAll.left - 5; rcOk.left = rcOk.right - okWidth; // show buttons ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDNONE), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); break; default: rcOk.left = dlgMid - (okWidth / 2); rcOk.right = rcOk.left + okWidth; } MoveWindow(GetDlgItem(hDlg, IDOK), rcOk.left, rcOk.top, rcOk.right - rcOk.left, rcOk.bottom - rcOk.top, FALSE); MoveWindow(GetDlgItem(hDlg, IDALL), rcAll.left, rcAll.top, rcAll.right - rcAll.left, rcAll.bottom - rcAll.top, FALSE); MoveWindow(GetDlgItem(hDlg, IDNONE), rcNone.left, rcNone.top, rcNone.right - rcNone.left, rcNone.bottom - rcNone.top, FALSE); MoveWindow(GetDlgItem(hDlg, IDCANCEL), rcCancel.left, rcCancel.top, rcCancel.right - rcCancel.left, rcCancel.bottom - rcCancel.top, FALSE); } // set text's SetWindowText(hDlg, pMsgBox->ptszTitle); SetDlgItemText(hDlg, TXT_NAME, pMsgBox->ptszInfoText); SetDlgItemText(hDlg, TXT_MESSAGE, pMsgBox->ptszMsg); TranslateDialogDefault(hDlg); return TRUE; } } break; case WM_CTLCOLORSTATIC: switch (GetWindowLongPtr((HWND)lParam, GWLP_ID)) { case STATIC_WHITERECT: case ICO_DLGLOGO: case ICO_MSGDLG: case TXT_MESSAGE: case TXT_NAME: SetTextColor((HDC)wParam, GetSysColor(COLOR_WINDOWTEXT)); return GetSysColor(COLOR_WINDOW); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, retOk); break; case IDCANCEL: EndDialog(hDlg, retCancel); break; case IDALL: EndDialog(hDlg, retAll); break; case IDNONE: EndDialog(hDlg, retNon); } break; case WM_DESTROY: DeleteObject((HFONT)SendDlgItemMessage(hDlg, TXT_NAME, WM_GETFONT, 0, 0)); break; } return FALSE; }
void PropSheet::Show(HINSTANCE hInstance, HWND hParent, std::string title, int startpage, bool floating, bool wizard) { HPROPSHEETPAGE *pages = new HPROPSHEETPAGE[list.size()]; PROPSHEETPAGE page; //common settings memset((void*)&page,0,sizeof(PROPSHEETPAGE)); page.dwSize = sizeof(PROPSHEETPAGE); page.hInstance = hInstance; int i=0; for (DlgList::iterator iter = list.begin(); iter != list.end(); iter++, i++) { if (wizard) { if (i == 0 || i == list.size()-1) page.dwFlags = PSP_HIDEHEADER; else page.dwFlags = PSP_USEHEADERTITLE|PSP_USEHEADERSUBTITLE; } else { page.dwFlags = PSP_USETITLE; } page.pszTemplate = iter->resource; page.pfnDlgProc = Tab::TabDlgProc; page.pszTitle = iter->title; page.pszHeaderTitle = wizard?iter->title:0; page.pszHeaderSubTitle = wizard?iter->hdrSubTitle:0; page.lParam = (LPARAM)iter->tab; pages[i] = CreatePropertySheetPage(&page); } PROPSHEETHEADER sheet; memset(&sheet,0,sizeof(sheet)); sheet.dwSize = sizeof(PROPSHEETHEADER); sheet.hInstance = hInstance; sheet.hwndParent = hParent; sheet.pszbmWatermark = watermark; sheet.pszbmHeader = header; if (icon) sheet.hIcon = icon; if (wizard) sheet.dwFlags = PSH_USECALLBACK | PSH_WIZARD97 | (watermark?PSH_WATERMARK:0) | (header?PSH_HEADER:0); else sheet.dwFlags = PSH_USECALLBACK | PSH_PROPTITLE; if (floating) sheet.dwFlags |= PSH_MODELESS; //else // sheet.dwFlags |= PSH_NOAPPLYNOW; if (icon) sheet.dwFlags |= PSH_USEHICON; sheet.pszCaption = ConvertUTF8ToWString(title).c_str(); sheet.nPages = (UINT)list.size(); sheet.phpage = pages; sheet.nStartPage = startpage; sheet.pfnCallback = (PFNPROPSHEETCALLBACK)Callback; if (wizard) { NONCLIENTMETRICS ncm = {0}; ncm.cbSize = sizeof(ncm); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); //Create the intro/end title font LOGFONT TitleLogFont = ncm.lfMessageFont; TitleLogFont.lfWeight = FW_BOLD; lstrcpy(TitleLogFont.lfFaceName, TEXT("Verdana Bold")); //StringCchCopy(TitleLogFont.lfFaceName, 32, TEXT("Verdana Bold")); HDC hdc = GetDC(NULL); //gets the screen DC INT FontSize = 12; TitleLogFont.lfHeight = 0 - GetDeviceCaps(hdc, LOGPIXELSY) * FontSize / 72; hTitleFont = CreateFontIndirect(&TitleLogFont); ReleaseDC(NULL, hdc); } else hTitleFont = 0; centered=false; PropertySheet(&sheet); if (!floating) { for (DlgList::iterator iter = list.begin(); iter != list.end(); iter++) { delete iter->tab; } DeleteObject(hTitleFont); } delete [] pages; }
BOOL CALLBACK InfoDialogBoxProc( HWND hWnd, UINT wmes, UINT wparam, LONG lparam ) { int i; switch( wmes ){ case WM_INITDIALOG: { char buf[1024]; int device=0; CheckCPU(); buf[0]='\0'; strcatfn( buf, "VenderID %s", szVenderID ); strcatfn( buf, "TypeID %d, FamilyID %d, ModelID %d, SteppingID %d", TypeID, FamilyID, ModelID, SteppingID); strcatfn( buf, "%s", szCpuName ); strcatfn( buf, "CpuClock実測値 %dMHz", fCpuClock ); strcatfn( buf, "MMX %s", (MMX_Flag)?"有":"無" ); strcatfn( buf, "SSE %s", (SSE_FP_Flag)?"有":"無" ); strcatfn( buf, "SSE2 %s", (SSE2_Flag)?"有":"無" ); strcatfn( buf, "3DNow! %s", (_3DNow_Flag)?"有":"無" ); strcatfn( buf, "e3DNow! %s", (_3DNowExt_Flag)?"有":"無" ); strcatfn( buf, "" ); device = EnumGraphicsDevice( ); for( i=0 ; i<device ; i++ ){ strcatfn( buf, "VideoCard(%d) %s", i+1, GetGraphicsDeviceName(i) ); } device = EnumSoundDevice(); for( i=0 ; i<device ; i++ ){ strcatfn( buf, "SoundCard(%d) %s", i+1, GetSoundDeviceName(i) ); } strcatfn( buf, "" ); strcatfn( buf, "OS %s", GetOSName() ); SetDlgItemText( hWnd, IDC_EDIT1, buf ); LOGFONT logfont; hFontLink=(HFONT)SendMessage(GetDlgItem(hWnd,IDC_WWW),WM_GETFONT,0,0); GetObject(hFontLink,sizeof(logfont),&logfont); logfont.lfUnderline=1; hFontLink=CreateFontIndirect(&logfont); SendDlgItemMessage(hWnd,IDC_WWW,WM_SETFONT,(WPARAM)hFontLink,0); oldLinkProc = (WNDPROC)GetWindowLong(GetDlgItem(hWnd,IDC_WWW),GWL_WNDPROC); SetWindowLong(GetDlgItem(hWnd,IDC_WWW),GWL_WNDPROC,(LONG)linkProc); return TRUE; } break; case WM_COMMAND: switch( LOWORD( wparam ) ){ case IDC_WWW: if(HIWORD(wparam) == STN_CLICKED){ char szTextTmp[100]; GetDlgItemText(hWnd,LOWORD(wparam),szTextTmp,100); ShellExecute(hWnd,NULL,szTextTmp,NULL,NULL,SW_SHOWNORMAL); } break; } break; case WM_DESTROY: DeleteObject(hFontLink); break; } return FALSE; } // InfoDialogBoxProc
int GetFontSettingFromDB(char *settings_group, char *prefix, LOGFONT* lf, COLORREF * colour, DWORD flags) { DBVARIANT dbv; char idstr[256]; BYTE style; int retval = 0; GetDefaultFontSetting(lf, colour); if (flags & FIDF_APPENDNAME) mir_snprintf(idstr, SIZEOF(idstr), "%sName", prefix); else mir_snprintf(idstr, SIZEOF(idstr), "%s", prefix); if (!db_get_ts(NULL, settings_group, idstr, &dbv)) { _tcscpy(lf->lfFaceName, dbv.ptszVal); db_free(&dbv); } else retval = 1; if (colour) { mir_snprintf(idstr, SIZEOF(idstr), "%sCol", prefix); *colour = db_get_dw(NULL, settings_group, idstr, *colour); } mir_snprintf(idstr, SIZEOF(idstr), "%sSize", prefix); lf->lfHeight = (char)db_get_b(NULL, settings_group, idstr, lf->lfHeight); //wsprintf(idstr, "%sFlags", prefix); //if (db_get_dw(NULL, settings_group, idstr, 0) & FIDF_SAVEACTUALHEIGHT) { // HDC hdc = GetDC(0); // lf->lfHeight = -lf->lfHeight; // ReleaseDC(0, hdc); //} mir_snprintf(idstr, SIZEOF(idstr), "%sSty", prefix); style = (BYTE) db_get_b(NULL, settings_group, idstr, (lf->lfWeight == FW_NORMAL ? 0 : DBFONTF_BOLD) | (lf->lfItalic ? DBFONTF_ITALIC : 0) | (lf->lfUnderline ? DBFONTF_UNDERLINE : 0) | lf->lfStrikeOut ? DBFONTF_STRIKEOUT : 0); lf->lfWidth = lf->lfEscapement = lf->lfOrientation = 0; lf->lfWeight = style & DBFONTF_BOLD ? FW_BOLD : FW_NORMAL; lf->lfItalic = (style & DBFONTF_ITALIC) != 0; lf->lfUnderline = (style & DBFONTF_UNDERLINE) != 0; lf->lfStrikeOut = (style & DBFONTF_STRIKEOUT) != 0; mir_snprintf(idstr, SIZEOF(idstr), "%sSet", prefix); lf->lfCharSet = db_get_b(NULL, settings_group, idstr, lf->lfCharSet); lf->lfOutPrecision = OUT_DEFAULT_PRECIS; lf->lfClipPrecision = CLIP_DEFAULT_PRECIS; lf->lfQuality = DEFAULT_QUALITY; lf->lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; if (lf->lfHeight > 0) { HDC hdc = GetDC(0); if (flags & FIDF_SAVEPOINTSIZE) { lf->lfHeight = -MulDiv(lf->lfHeight, GetDeviceCaps(hdc, LOGPIXELSY), 72); } else { // assume SAVEACTUALHEIGHT TEXTMETRIC tm; HFONT hFont = CreateFontIndirect(lf); HFONT hOldFont = (HFONT)SelectObject(hdc, hFont); GetTextMetrics(hdc, &tm); lf->lfHeight = -(lf->lfHeight - tm.tmInternalLeading); SelectObject(hdc, hOldFont); DeleteObject(hFont); } //lf->lfHeight = -MulDiv(lf->lfHeight, GetDeviceCaps(hdc, LOGPIXELSY), 72); ReleaseDC(0, hdc); } return retval; }
bool GEItescriptsDlg_Init ( HWND hwnd ) { idWindow* window; rvGEWindowWrapper* wrapper; HWND script; // Extract the window pointer from the win32 windows user data long window = (idWindow*)GetWindowLong ( hwnd, GWL_USERDATA ); assert ( window ); // Get the window wrapper of the script window wrapper = rvGEWindowWrapper::GetWrapper ( window ); assert ( wrapper ); // Get the edit box used to edit the script script = GetDlgItem ( hwnd, IDC_GUIED_SCRIPT ); UINT tabsize = 16; SendMessage ( script, EM_SETTABSTOPS, 1, (LPARAM)&tabsize ); SetWindowLong ( script, GWL_USERDATA, GetWindowLong ( script, GWL_WNDPROC ) ); SetWindowLong ( script, GWL_WNDPROC, (LONG) GEScriptEdit_WndProc ); TEXTMETRIC tm; HDC dc; dc = GetDC ( script ); GetTextMetrics ( dc, &tm ); ReleaseDC ( script, dc ); LOGFONT lf; ZeroMemory ( &lf, sizeof(lf) ); lf.lfHeight = tm.tmHeight; strcpy ( lf.lfFaceName, "Courier New" ); SendMessage ( script, WM_SETFONT, (WPARAM)CreateFontIndirect ( &lf ), 0 ); SendMessage ( script, EM_SETMARGINS, EC_LEFTMARGIN|EC_RIGHTMARGIN, MAKELONG(10,10) ); int i; for ( i = 0; i < wrapper->GetVariableDict().GetNumKeyVals ( ); i ++ ) { const idKeyValue* key = wrapper->GetVariableDict().GetKeyVal ( i ); SendMessage ( script, EM_SETSEL, -1, -1 ); SendMessage ( script, EM_REPLACESEL, FALSE, (LPARAM)key->GetKey().c_str() ); SendMessage ( script, EM_SETSEL, -1, -1 ); SendMessage ( script, EM_REPLACESEL, FALSE, (LPARAM)"\t" ); SendMessage ( script, EM_SETSEL, -1, -1 ); SendMessage ( script, EM_REPLACESEL, FALSE, (LPARAM)key->GetValue().c_str() ); SendMessage ( script, EM_SETSEL, -1, -1 ); SendMessage ( script, EM_REPLACESEL, FALSE, (LPARAM)"\r\n" ); } if ( i ) { SendMessage ( script, EM_SETSEL, -1, -1 ); SendMessage ( script, EM_REPLACESEL, FALSE, (LPARAM)"\r\n" ); } for ( i = 0; i < wrapper->GetScriptDict().GetNumKeyVals ( ); i ++ ) { const idKeyValue* key = wrapper->GetScriptDict().GetKeyVal ( i ); SendMessage ( script, EM_SETSEL, -1, -1 ); SendMessage ( script, EM_REPLACESEL, FALSE, (LPARAM)va("%s\r\n", key->GetKey().c_str() ) ); SendMessage ( script, EM_SETSEL, -1, -1 ); SendMessage ( script, EM_REPLACESEL, FALSE, (LPARAM)key->GetValue().c_str() ); SendMessage ( script, EM_SETSEL, -1, -1 ); SendMessage ( script, EM_REPLACESEL, FALSE, (LPARAM)"\r\n\r\n" ); } SendMessage ( script, EM_SETSEL, 0, 0 ); SendMessage ( script, EM_SCROLLCARET, 0, 0 ); return true; }
LRESULT CALLBACK CSkeletalViewerApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_INITDIALOG: { LOGFONT lf; // Clean state the class Nui_Zero(); // Bind application window handle m_hWnd=hWnd; // Initialize and start NUI processing Nui_Init(); // Set the font for Frames Per Second GetObject((HFONT) GetStockObject(DEFAULT_GUI_FONT),sizeof(lf),&lf); lf.lfHeight*=4; m_hFontFPS=CreateFontIndirect(&lf); SendDlgItemMessage(hWnd,IDC_FPS,WM_SETFONT,(WPARAM) m_hFontFPS,0); // Use the same font for distance and user SendDlgItemMessage(hWnd,IDC_DISTANCE,WM_SETFONT,(WPARAM) m_hFontFPS,0); SendDlgItemMessage(hWnd,IDC_USER,WM_SETFONT,(WPARAM) m_hFontFPS,0); UpdateComboBox(); SendDlgItemMessage (m_hWnd, IDC_CAMERAS, CB_SETCURSEL, 0, 0); } break; case WM_USER_UPDATE_FPS: { ::SetDlgItemInt( m_hWnd, static_cast<int>(wParam), static_cast<int>(lParam), FALSE ); } break; case WM_USER_UPDATE_DISTANCE: { ::SetDlgItemInt( m_hWnd, static_cast<int>(wParam), static_cast<int>(lParam), FALSE ); } break; case WM_USER_UPDATE_USER: { ::SetDlgItemInt( m_hWnd, static_cast<int>(wParam), static_cast<int>(lParam), FALSE ); } break; case WM_USER_UPDATE_COMBO: { UpdateComboBox(); } break; case WM_COMMAND: if( HIWORD( wParam ) == CBN_SELCHANGE ) { LRESULT index = ::SendDlgItemMessage(m_hWnd, IDC_CAMERAS, CB_GETCURSEL, 0, 0); switch (LOWORD(wParam)) { case IDC_CAMERAS: { if (!m_fUpdatingUi) // Don't reconnect as a result of updating the combo box. { Nui_UnInit(); Nui_Zero(); Nui_Init(static_cast<int>(index)); } } break; } } break; // Handle key presses case WM_KEYUP: switch (wParam) { default: // Print the info about the key I just pressed char msg[1024]; sprintf_s (msg, 1024, "wParam: %s lParam: %s", wParam, lParam); WCHAR msg_u[1024]; MultiByteToWideChar(0, 0, msg, 1024, msg_u, 6); MessageBox(hWnd, msg_u, TEXT("Display pressed character"), NULL); } break; // If the titlebar X is clicked destroy app case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: // Uninitialize NUI Nui_UnInit(); // Other cleanup DeleteObject(m_hFontFPS); // Quit the main message pump PostQuitMessage(0); break; } return (FALSE); }
// // Framework functions // bool Setup() { // // Get a handle to a device context. // HDC hdc = CreateCompatibleDC( 0 ); HFONT hFont; HFONT hFontOld; // // Describe the font we want. // LOGFONT lf; ZeroMemory(&lf, sizeof(LOGFONT)); lf.lfHeight = 25; // in logical units lf.lfWidth = 12; // in logical units lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold) lf.lfItalic = false; lf.lfUnderline = false; lf.lfStrikeOut = false; lf.lfCharSet = DEFAULT_CHARSET; lf.lfOutPrecision = 0; lf.lfClipPrecision = 0; lf.lfQuality = 0; lf.lfPitchAndFamily = 0; strcpy(lf.lfFaceName, "Times New Roman"); // font style // // Create the font and select it with the device context. // hFont = CreateFontIndirect(&lf); hFontOld = (HFONT)SelectObject(hdc, hFont); // // Create the text mesh based on the selected font in the HDC. // D3DXCreateText(Device, hdc, "Direct3D", 0.001f, 0.1f, &Text, 0, 0); // // Restore the old font and free the acquired HDC. // SelectObject(hdc, hFontOld); DeleteObject( hFont ); DeleteDC( hdc ); // // Lights. // D3DXVECTOR3 dir(0.0f, -0.5f, 1.0f); D3DXCOLOR col = d3d::WHITE; D3DLIGHT9 light = d3d::InitDirectionalLight(&dir, &col); Device->SetLight(0, &light); Device->LightEnable(0, true); Device->SetRenderState(D3DRS_NORMALIZENORMALS, true); Device->SetRenderState(D3DRS_SPECULARENABLE, true); // // Set camera. // D3DXVECTOR3 pos(0.0f, 1.5f, -3.3f); D3DXVECTOR3 target(0.0f, 0.0f, 0.0f); D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); D3DXMATRIX V; D3DXMatrixLookAtLH( &V, &pos, &target, &up); Device->SetTransform(D3DTS_VIEW, &V); // // Set projection matrix. // D3DXMATRIX proj; D3DXMatrixPerspectiveFovLH( &proj, D3DX_PI * 0.25f, // 45 - degree (float)Width / (float)Height, 0.01f, 1000.0f); Device->SetTransform(D3DTS_PROJECTION, &proj); return true; }
/////////////////////////////////////////////////////////////////////////////// // Draw int CXHtmlDraw::Draw(HDC hDC, LPCTSTR lpszText, XHTMLDRAWSTRUCT * pXHDS, BOOL bUnderlineUrl) { TRACE(_T("in CXHtmlDraw::Draw: <%s> bUnderlineUrl=%d\n"), lpszText, bUnderlineUrl); static BOOL bInDraw = FALSE; if (bInDraw) return 0; bInDraw = TRUE; // check parameters ---------------------------------------------- _ASSERTE(hDC); _ASSERTE(lpszText); _ASSERTE(pXHDS); if (!hDC || !lpszText || (lpszText[0] == _T('\0')) || !pXHDS) { bInDraw = FALSE; return 0; } HWND hWnd = ::WindowFromDC(hDC); if (!::IsWindow(hWnd)) { TRACE(_T("warn: not a window\n")); bInDraw = FALSE; return 0; } // check if window is hidden ------------------------------------ if (!::IsWindowVisible(hWnd)) { TRACE(_T("warn: window invisible\n")); bInDraw = FALSE; return 0; } RECT rectClip; int nResult = ::GetClipBox(hDC, &rectClip); if (nResult == NULLREGION) { // window is covered TRACE(_T("warn: window is covered\n")); bInDraw = FALSE; return 0; } // initialize for drawing --------------------------------------- // rectText is used to draw into the dc RECT rectText = pXHDS->rect; if ((rectText.left >= rectText.right) || (rectText.top >= rectText.bottom)) { TRACE(_T("warn: bad rect\n")); bInDraw = FALSE; return 0; } // rectDraw is the rect for the entire drawing area RECT rectDraw = pXHDS->rect; int nRectWidth = rectDraw.right - rectDraw.left; int nRectHeight = rectDraw.bottom - rectDraw.top; int nXOffset = rectDraw.left; // set up for double buffering HDC hMemDC = CreateCompatibleDC(hDC); HBITMAP hBitmap = CreateCompatibleBitmap(hDC, nRectWidth, nRectHeight); HBITMAP hOldBitmap = (HBITMAP) SelectObject(hMemDC, hBitmap); if (pXHDS->bTransparent && !pXHDS->hDC) { // save a bitmap of the original drawing area, in case // there are links, and we need to erase the underline pXHDS->hDC = CreateCompatibleDC(hDC); pXHDS->hBitmap = CreateCompatibleBitmap(hDC, nRectWidth, nRectHeight); pXHDS->hOldBitmap = (HBITMAP) SelectObject(pXHDS->hDC, pXHDS->hBitmap); BitBlt(pXHDS->hDC, 0, 0, nRectWidth, nRectHeight, hDC, rectDraw.left, rectDraw.top, SRCCOPY); BitBlt(hMemDC, 0, 0, nRectWidth, nRectHeight, hDC, rectDraw.left, rectDraw.top, SRCCOPY); } else if (pXHDS->bTransparent && pXHDS->hDC) { // restore the original drawing area from saved HDC BitBlt(hMemDC, 0, 0, nRectWidth, nRectHeight, pXHDS->hDC, 0, 0, SRCCOPY); } pXHDS->rectAnchor = rectText; // save rect in case of anchor // remap rectText to memory dc - left and top start at 0 rectText.left = 0; rectText.top = 0; rectText.right = nRectWidth; rectText.bottom = nRectHeight; // create initial font ------------------------------------------ LOGFONT lf = { 0 }; LOGFONT prev_lf = { 0 }; if (pXHDS->bLogFont) { TRACE(_T("using logfont\n")); memcpy(&lf, &pXHDS->lf, sizeof(LOGFONT)); } else { HFONT hfont = (HFONT)::GetCurrentObject(hDC, OBJ_FONT); //+++1.1 if (hfont) GetObject(hfont, sizeof(LOGFONT), &lf); else GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf); } memcpy(&prev_lf, &lf, sizeof(LOGFONT)); // variable initialization -------------------------------------- TCHAR *pszText = new TCHAR [m_nMaxText+1]; memset(pszText, 0, (m_nMaxText+1)*sizeof(TCHAR)); _tcsncpy(pszText, lpszText, m_nMaxText); TCHAR *pTextBuffer = pszText; // save buffer address for delete TCHAR *pszText1 = new TCHAR [m_nMaxText+1]; memset(pszText1, 0, (m_nMaxText+1)*sizeof(TCHAR)); if (pXHDS->pszAnchor) delete [] pXHDS->pszAnchor; pXHDS->pszAnchor = NULL; pXHDS->bHasAnchor = FALSE; pXHDS->bAnchorIsUnderlined = FALSE; BOOL bInAnchor = FALSE; int n = (int) _tcslen(pszText); // n must be int int i = 0; int nWidth = 0; pXHDS->bHasAnchor = FALSE; pXHDS->nRightX = 0; COLORREF crText = pXHDS->crText; if (crText == COLOR_NONE) crText = GetSysColor(COLOR_WINDOWTEXT); COLORREF crBackground = pXHDS->crBackground; if (crBackground == COLOR_NONE) crBackground = GetSysColor(COLOR_WINDOW); COLORREF crTextNew = crText; COLORREF crBkgndNew = crBackground; // if no transparency, fill entire rect with default bg color if (!pXHDS->bTransparent) { HBRUSH hbrush = CreateSolidBrush(crBkgndNew); _ASSERTE(hbrush); FillRect(hMemDC, &rectText, hbrush); if (hbrush) DeleteObject(hbrush); } BOOL bBold = pXHDS->bBold; BOOL bItalic = pXHDS->bItalic; BOOL bUnderline = pXHDS->bUnderline; BOOL bStrikeThrough = pXHDS->bStrikeThrough; BOOL bSubscript = FALSE; BOOL bSuperscript = FALSE; int nSizeChange = 0; // replace character entity names in text with codes ------------ TCHAR ent[3] = { _T('\0') }; ent[0] = _T('\001'); // each entity name is replaced with a two-character // code that begins with \001 BOOL bCharacterEntities = FALSE; // assume no char entities // we are replacing character entites with a two-character sequence, // so the resulting string will be shorter size_t buflen = _tcslen(pszText) + 100; TCHAR *buf = new TCHAR [buflen]; memset(buf, 0, buflen*sizeof(TCHAR)); for (i = 0; m_aCharEntities[i].pszName != NULL; i++) { ent[1] = m_aCharEntities[i].cCode; int nRep = _tcsistrrep(pszText, m_aCharEntities[i].pszName, ent, buf); if (nRep > 0) { bCharacterEntities = TRUE; _tcscpy(pszText, buf); } } delete [] buf; buf = NULL; TEXTMETRIC tm = { 0 }; n = (int) _tcslen(pszText); // get length again after char entity substitution int textLen = n; while ((n > 0) && pszText && (pszText < (pTextBuffer + textLen))) { TRACE(_T("start while: n=%d pszText=<%s>\n"), n, pszText); /////////////////////////////////////////////////////////////////////// if (_tcsnicmp(pszText, _T("<B>"), 3) == 0) // check for <b> or <B> { n -= 3; pszText += 3; bBold++;// = TRUE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("</B>"), 4) == 0) // check for </B> { n -= 4; pszText += 4; if (bBold) bBold--;// = FALSE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("<I>"), 3) == 0) // check for <I> { n -= 3; pszText += 3; bItalic++;// = TRUE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("</I>"), 4) == 0) // check for </I> { n -= 4; pszText += 4; if (bItalic) bItalic--;// = FALSE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("<U>"), 3) == 0) // check for <U> { n -= 3; pszText += 3; bUnderline++;// = TRUE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("</U>"), 4) == 0) // check for </U> { n -= 4; pszText += 4; if (bUnderline) bUnderline--;// = FALSE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("<S>"), 3) == 0) // check for <S> { n -= 3; pszText += 3; bStrikeThrough++;// = TRUE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("</S>"), 4) == 0) // check for </S> { n -= 4; pszText += 4; if (bStrikeThrough) bStrikeThrough--;// = FALSE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("<BIG>"), 5) == 0) // check for <BIG> { n -= 5; pszText += 5; if (lf.lfHeight > 0) lf.lfHeight += 2; else lf.lfHeight -= 2; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("</BIG>"), 6) == 0) // check for </BIG> { n -= 6; pszText += 6; if (lf.lfHeight > 0) lf.lfHeight -= 2; else lf.lfHeight += 2; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("<SMALL>"), 7) == 0) // check for <SMALL> { n -= 7; pszText += 7; if (lf.lfHeight > 0) lf.lfHeight -= 2; else lf.lfHeight += 2; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("</SMALL>"), 8) == 0) // check for </SMALL> { n -= 8; pszText += 8; if (lf.lfHeight > 0) lf.lfHeight += 2; else lf.lfHeight -= 2; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("<SUB>"), 5) == 0) // check for <SUB> { n -= 5; pszText += 5; bSubscript++;// = TRUE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("</SUB>"), 6) == 0) // check for </SUB> { n -= 6; pszText += 6; if (bSubscript) bSubscript--;// = FALSE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("<SUP>"), 5) == 0) // check for <SUP> { n -= 5; pszText += 5; bSuperscript++;// = TRUE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("</SUP>"), 6) == 0) // check for </SUP> { n -= 6; pszText += 6; if (bSuperscript) bSuperscript--;// = FALSE; continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("<FONT"), 5) == 0) // check for <FONT { TRACE(_T("found font\n")); TCHAR *cp = _tcschr(pszText, _T('>')); if (cp) { TCHAR szAttributes[XHTMLDRAW_MAX_TEXT] = { 0 }; _tcsncpy(szAttributes, &pszText[5], cp-pszText-5); TRACE(_T("szAttributes=<%s>\n"), szAttributes); size_t m = _tcslen(szAttributes); n -= (int) (cp - pszText + 1); pszText = cp + 1; // loop to parse FONT attributes while (m > 0) { // trim left whitespace if ((_tcslen(szAttributes) > 0) && (szAttributes[0] == _T(' '))) { m--; _tcscpy(szAttributes, &szAttributes[1]); continue; } /////////////////////////////////////////////////////////// if (_tcsnicmp(szAttributes, _T("COLOR"), 5) == 0) { TRACE(_T("found color\n")); TCHAR *cp2 = _tcschr(szAttributes, _T('"')); if (cp2) { m -= (cp2 - szAttributes) + 1; _tcscpy(szAttributes, cp2+1); cp2 = _tcschr(szAttributes, _T('"')); if (cp2) { *cp2 = _T('\0'); TCHAR szColor[XHTMLDRAW_MAX_TEXT] = { _T('\0') }; _tcsncpy(szColor, szAttributes, cp2-szAttributes+1); TRACE(_T("szColor=<%s>\n"), szColor); CXNamedColors nc(szColor); if (!pXHDS->bIgnoreColorTag) crTextNew = nc.GetRGB(); _tcscpy(szAttributes, cp2+1); m = _tcslen(szAttributes); } } else break; } /////////////////////////////////////////////////////////// else if (_tcsnicmp(szAttributes, _T("BGCOLOR"), 7) == 0) { TRACE(_T("found bgcolor\n")); TCHAR *cp2 = _tcschr(szAttributes, _T('"')); if (cp2) { m -= cp2 - szAttributes + 1; _tcscpy(szAttributes, cp2+1); cp2 = _tcschr(szAttributes, _T('"')); if (cp2) { *cp2 = _T('\0'); TCHAR szBgColor[XHTMLDRAW_MAX_TEXT] = { _T('\0') }; _tcsncpy(szBgColor, szAttributes, cp2-szAttributes+1); TRACE(_T("szBgColor=<%s>\n"), szBgColor); CXNamedColors nc(szBgColor); crBkgndNew = nc.GetRGB(); _tcscpy(szAttributes, cp2+1); m = _tcslen(szAttributes); } } else break; } /////////////////////////////////////////////////////////// else if (_tcsnicmp(szAttributes, _T("FACE"), 4) == 0) { TCHAR *cp2 = _tcschr(szAttributes, _T('"')); if (cp2) { m -= cp2 - szAttributes + 1; _tcscpy(szAttributes, cp2+1); cp2 = _tcschr(szAttributes, _T('"')); if (cp2) { const int nFaceSize = sizeof(lf.lfFaceName); // in bytes int nMaxFaceSize = nFaceSize / sizeof(TCHAR); // in TCHARs memset(lf.lfFaceName, 0, nFaceSize); int nNewFaceSize = (int)(cp2 - szAttributes); // in TCHARs memset(&lf.lfFaceName, 0, nFaceSize); _tcsncpy(lf.lfFaceName, szAttributes, (nNewFaceSize > nMaxFaceSize) ? nMaxFaceSize : nNewFaceSize); TRACE(_T("lf.lfFaceName=<%s>\n"), lf.lfFaceName); m -= cp2 - szAttributes + 1; if (m > 0) _tcscpy(szAttributes, cp2+1); else szAttributes[0] = _T('\0'); m = _tcslen(szAttributes); } } else break; } /////////////////////////////////////////////////////////// else if (_tcsnicmp(szAttributes, _T("SIZE"), 4) == 0) { TCHAR *cp2 = _tcschr(szAttributes, _T('"')); if (cp2) { m -= cp2 - szAttributes + 1; _tcscpy(szAttributes, cp2+1); cp2 = _tcschr(szAttributes, _T('"')); if (cp2) { int nSize = _ttoi(szAttributes); lf.lfHeight -= nSize; nSizeChange = nSize; m -= cp2 - szAttributes + 1; if (m > 0) _tcscpy(szAttributes, cp2+1); else szAttributes[0] = _T('\0'); m = _tcslen(szAttributes); } } else break; } else { while ((_tcslen(szAttributes) > 0) && (szAttributes[0] != _T(' '))) { m--; _tcscpy(szAttributes, &szAttributes[1]); } } } } else { TRACE(_T("ERROR no closing >\n")); pszText += 5; n -= 5; } continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("</FONT>"), 7) == 0) // check for </FONT> { n -= 7; pszText += 7; crTextNew = crText; crBkgndNew = crBackground; memcpy(&lf, &prev_lf, sizeof(lf)); continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("<A"), 2) == 0) // check for <A { TCHAR *cp = 0; if ((cp = _tcsistr(pszText, _T("HREF="))) != NULL) // check for HREF= { cp += 5; if (*cp == _T('"')) cp += 1; TCHAR *cp2 = _tcschr(cp, _T('>')); if (cp2) { size_t len = cp2 - cp; if (pXHDS->pszAnchor) delete [] pXHDS->pszAnchor; pXHDS->pszAnchor = new TCHAR [len+4]; memset(pXHDS->pszAnchor, 0, (len+4)*sizeof(TCHAR)); _tcsncpy(pXHDS->pszAnchor, cp, len); size_t last = _tcslen(pXHDS->pszAnchor); if (last > 0) last--; if (pXHDS->pszAnchor[last] == _T('"')) pXHDS->pszAnchor[last] = _T('\0'); TRACE(_T("len=%d pXHDS->szUrl=<%s>\n"), len, pXHDS->pszAnchor); n -= (int) (cp2 + 1 - pszText); pszText = cp2 + 1; TRACE(_T("pszText=<%s>\n"), pszText); // set start X of url pXHDS->rectAnchor.left = rectText.left + nXOffset; TRACE(_T("setting pXHDS->rectAnchor.left to %d\n"), pXHDS->rectAnchor.left); crTextNew = pXHDS->crAnchorText; //RGB(0,0,255); //pXHDS->crText; crBkgndNew = crBackground; memcpy(&lf, &prev_lf, sizeof(lf)); bInAnchor = TRUE; if (bUnderlineUrl) { pXHDS->bAnchorIsUnderlined = TRUE; bUnderline++; } } } else { TRACE(_T("ERROR no closing >\n")); pszText += 2; n -= 2; } continue; } /////////////////////////////////////////////////////////////////////// else if (_tcsnicmp(pszText, _T("</A>"), 4) == 0) // check for </A> { n -= 4; pszText += 4; if (bInAnchor) { pXHDS->rectAnchor.right = rectText.left + nXOffset; pXHDS->bHasAnchor = TRUE; TRACE(_T("setting pXHDS->rectAnchor.right to %d\n"), pXHDS->rectAnchor.right); if (bUnderlineUrl) bUnderline--; crTextNew = crText; crBkgndNew = crBackground; memcpy(&lf, &prev_lf, sizeof(lf)); } bInAnchor = FALSE; continue; } /////////////////////////////////////////////////////////////////////// // plain text else { TRACE(_T("text: pszText=<%s>\n"), pszText); TCHAR *cp = _tcschr(pszText, _T('<')); if (cp) { // there's another tag _tcsncpy(pszText1, pszText, cp - pszText); pszText1[cp-pszText] = _T('\0'); TRACE(_T("pszText1=<%s>\n"), pszText1); if (_tcslen(pszText1) <= 0) { if (_tcslen(pszText) != 0) { _tcscpy(pszText1, pszText); n -= 1; } } pszText = cp; } else { // no more html tags _tcscpy(pszText1, pszText); pszText = NULL; } } TRACE(_T("pszText=<%s>\n"), pszText); TRACE(_T("pszText1=<%s>\n"), pszText1); // create new font ------------------------------------------ lf.lfWeight = bBold ? FW_BOLD : FW_NORMAL; lf.lfUnderline = (BYTE) bUnderline; lf.lfItalic = (BYTE) bItalic; lf.lfStrikeOut = (BYTE) bStrikeThrough; HFONT hNewFont = CreateFontIndirect(&lf); _ASSERTE(hNewFont); HFONT hOldFont = (HFONT) SelectObject(hMemDC, hNewFont); SetTextColor(hMemDC, crTextNew); if (pXHDS->crTextBackground != COLOR_NONE) SetBkColor(hMemDC, pXHDS->crTextBackground); else SetBkMode(hMemDC, TRANSPARENT); // need transparency for italic fonts // replace char entities ------------------------------------ size_t end = _tcslen(pszText1); buflen = end + 100; _ASSERTE(buf == NULL); buf = new TCHAR [buflen]; memset(buf, 0, buflen*sizeof(TCHAR)); _tcsncpy(buf, pszText1, buflen-1); ReplaceCharEntities(buf, end); int len = (int)_tcslen(buf); SIZE size; GetTextExtentPoint32(hMemDC, buf, len, &size); LONG width = size.cx; if ((crBkgndNew != crBackground) && (pXHDS->crTextBackground == COLOR_NONE)) { // changing backgrounds, so fill in with new color HBRUSH hbrushnew = CreateSolidBrush(crBkgndNew); if (hbrushnew) { RECT rect = rectText; rect.right = rect.left + width + 1; if (bItalic) { rect.right += 1; // italic needs a little more if (!IsTrueType(hMemDC)) rect.right += 2; // non-TTF fonts need even more } if (rect.right > rectText.right) rect.right = rectText.right; FillRect(hMemDC, &rect, hbrushnew); DeleteObject(hbrushnew); } } UINT uFormat = pXHDS->uFormat; if (pXHDS->bUseEllipsis) uFormat |= DT_END_ELLIPSIS; if (pXHDS->bHasAnchor) { // set rect for anchor RECT rectCalc = rectText; int nHeight = DrawText(hMemDC, buf, -1, &rectCalc, uFormat | DT_CALCRECT); TRACE(_T("nHeight=%d -----\n"), nHeight); pXHDS->rectAnchor.bottom = pXHDS->rectAnchor.top + nHeight; } RECT savedrect = rectText; GetTextMetrics(hMemDC, &tm); int nBaselineAdjust = tm.tmAscent / 2; if (bSubscript) { rectText.top += nBaselineAdjust; rectText.bottom += nBaselineAdjust; } if (bSuperscript) { rectText.top -= nBaselineAdjust; rectText.bottom -= nBaselineAdjust; } // draw text ------------------------------------------------ TRACE(_T("DrawText: <%s>\n"), buf); DrawText(hMemDC, buf, -1, &rectText, uFormat); rectText = savedrect; nSizeChange = 0; if (hOldFont) SelectObject(hMemDC, hOldFont); if (hNewFont) DeleteObject(hNewFont); hNewFont = 0; hOldFont = 0; delete [] buf; buf = NULL; rectText.left += width; n -= (int)_tcslen(pszText1); } // while // save the rightmost pixel position - note that rectText // is remapped to 0,0 for the memory dc pXHDS->nRightX = rectText.left + nXOffset; TRACE(_T("nRightX = %d =====\n"), pXHDS->nRightX); // end double buffering BitBlt(hDC, rectDraw.left, rectDraw.top, nRectWidth, nRectHeight, hMemDC, 0, 0, SRCCOPY); // swap back the original bitmap if (hOldBitmap) SelectObject(hMemDC, hOldBitmap); if (hBitmap) DeleteObject(hBitmap); hBitmap = 0; DeleteDC(hMemDC); hMemDC = 0; if (pTextBuffer) delete [] pTextBuffer; pTextBuffer = 0; if (pszText1) delete [] pszText1; pszText1 = 0; bInDraw = FALSE; return nWidth; }
void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isTraditional, bool isMultiLine) { Window::init(hInst, parent); int vertical = isVertical?(TCS_VERTICAL | TCS_MULTILINE | TCS_RIGHTJUSTIFY):0; _isTraditional = isTraditional; _isVertical = isVertical; _isMultiLine = isMultiLine; INITCOMMONCONTROLSEX icce; icce.dwSize = sizeof(icce); icce.dwICC = ICC_TAB_CLASSES; InitCommonControlsEx(&icce); int multiLine = isMultiLine?(_isTraditional?TCS_MULTILINE:0):0; int style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE |\ TCS_FOCUSNEVER | TCS_TABS | vertical | multiLine; style |= TCS_OWNERDRAWFIXED; _hSelf = ::CreateWindowEx( 0, WC_TABCONTROL, TEXT("Tab"), style, 0, 0, 0, 0, _hParent, NULL, _hInst, 0); if (!_hSelf) { throw std::runtime_error("TabBarPlus::init : CreateWindowEx() function return null"); } _tooltips = ::CreateWindowEx( 0, TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP | TTS_NOPREFIX, 0, 0, 0, 0, _hParent, NULL, _hInst, 0); if (!_tooltips) { throw std::runtime_error("TabBarPlus::init : tooltip CreateWindowEx() function return null"); } ::SendMessage(_hSelf, TCM_SETTOOLTIPS, (WPARAM)_tooltips, 0); if (!_isTraditional) { if (!_hwndArray[_nbCtrl]) { _hwndArray[_nbCtrl] = _hSelf; _ctrlID = _nbCtrl; } else { int i = 0; bool found = false; for ( ; i < nbCtrlMax && !found ; ++i) if (!_hwndArray[i]) found = true; if (!found) { _ctrlID = -1; destroy(); throw std::runtime_error("TabBarPlus::init : Tab Control error - Tab Control # is over its limit"); } _hwndArray[i] = _hSelf; _ctrlID = i; } ++_nbCtrl; ::SetWindowLongPtr(_hSelf, GWLP_USERDATA, (LONG_PTR)this); _tabBarDefaultProc = reinterpret_cast<WNDPROC>(::SetWindowLongPtr(_hSelf, GWLP_WNDPROC, (LONG_PTR)TabBarPlus_Proc)); } LOGFONT LogFont; _hFont = (HFONT)::SendMessage(_hSelf, WM_GETFONT, 0, 0); if (_hFont == NULL) _hFont = (HFONT)::GetStockObject(DEFAULT_GUI_FONT); if (_hLargeFont == NULL) _hLargeFont = (HFONT)::GetStockObject(SYSTEM_FONT); if (::GetObject(_hFont, sizeof(LOGFONT), &LogFont) != 0) { LogFont.lfEscapement = 900; LogFont.lfOrientation = 900; _hVerticalFont = CreateFontIndirect(&LogFont); LogFont.lfWeight = 900; _hVerticalLargeFont = CreateFontIndirect(&LogFont); } }
void Win32TaskbarManager::setCount(int count) { if (_taskbar == NULL) return; if (count == 0) { _taskbar->SetOverlayIcon(getHwnd(), NULL, L""); return; } // FIXME: This isn't really nice and could use a cleanup. // The only good thing is that it doesn't use GDI+ // and thus does not have a dependancy on it, // with the downside of being a lot more ugly. // Maybe replace it by a Graphic::Surface, use // ScummVM font drawing and extract the contents at // the end? if (_count != count || _icon == NULL) { // Cleanup previous icon _count = count; if (_icon) DestroyIcon(_icon); Common::String countString = (count < 100 ? Common::String::format("%d", count) : "9+"); // Create transparent background BITMAPV5HEADER bi; ZeroMemory(&bi, sizeof(BITMAPV5HEADER)); bi.bV5Size = sizeof(BITMAPV5HEADER); bi.bV5Width = 16; bi.bV5Height = 16; bi.bV5Planes = 1; bi.bV5BitCount = 32; bi.bV5Compression = BI_RGB; // Set 32 BPP alpha format bi.bV5RedMask = 0x00FF0000; bi.bV5GreenMask = 0x0000FF00; bi.bV5BlueMask = 0x000000FF; bi.bV5AlphaMask = 0xFF000000; // Get DC HDC hdc; hdc = GetDC(NULL); HDC hMemDC = CreateCompatibleDC(hdc); ReleaseDC(NULL, hdc); // Create a bitmap mask HBITMAP hBitmapMask = CreateBitmap(16, 16, 1, 1, NULL); // Create the DIB section with an alpha channel void *lpBits; HBITMAP hBitmap = CreateDIBSection(hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&lpBits, NULL, 0); HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // Load the icon background HICON hIconBackground = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(1002 /* IDI_COUNT */)); DrawIconEx(hMemDC, 0, 0, hIconBackground, 16, 16, 0, 0, DI_NORMAL); DeleteObject(hIconBackground); // Draw the count LOGFONT lFont; memset(&lFont, 0, sizeof(LOGFONT)); lFont.lfHeight = 10; lFont.lfWeight = FW_BOLD; lFont.lfItalic = 1; strcpy(lFont.lfFaceName, "Arial"); HFONT hFont = CreateFontIndirect(&lFont); SelectObject(hMemDC, hFont); RECT rect; SetRect(&rect, 4, 4, 12, 12); SetTextColor(hMemDC, RGB(48, 48, 48)); SetBkMode(hMemDC, TRANSPARENT); DrawText(hMemDC, countString.c_str(), -1, &rect, DT_NOCLIP|DT_CENTER); // Set the text alpha to fully opaque (we consider the data inside the text rect) DWORD *lpdwPixel = (DWORD *)lpBits; for (int x = 3; x < 12; x++) { for(int y = 3; y < 12; y++) { unsigned char *p = (unsigned char *)(lpdwPixel + x * 16 + y); if (p[0] != 0 && p[1] != 0 && p[2] != 0) p[3] = 255; } } // Cleanup DC DeleteObject(hFont); SelectObject(hMemDC, hOldBitmap); DeleteDC(hMemDC); // Prepare our new icon ICONINFO ii; ii.fIcon = FALSE; ii.xHotspot = 0; ii.yHotspot = 0; ii.hbmMask = hBitmapMask; ii.hbmColor = hBitmap; _icon = CreateIconIndirect(&ii); DeleteObject(hBitmap); DeleteObject(hBitmapMask); if (!_icon) { warning("[Win32TaskbarManager::setCount] Cannot create icon for count"); return; } } // Sets the overlay icon LPWSTR desc = ansiToUnicode(Common::String::format("Found games: %d", count).c_str()); _taskbar->SetOverlayIcon(getHwnd(), _icon, desc); delete[] desc; }
int CBrowseFolder::BrowseCallBackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM /*lpData*/) { RECT ListViewRect,Dialog; //Initialization callback message if (uMsg == BFFM_INITIALIZED) { if (_tcslen(m_CheckText) > 0) { bool bSecondCheckbox = (_tcslen(m_CheckText2)!=0); //Rectangles for getting the positions checkbox = CreateWindowEx( 0, _T("BUTTON"), m_CheckText, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|BS_AUTOCHECKBOX, 0,100,100,50, hwnd, 0, NULL, NULL); if (checkbox == NULL) return 0; if (bSecondCheckbox) { //Rectangles for getting the positions checkbox2 = CreateWindowEx( 0, _T("BUTTON"), m_CheckText2, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|BS_AUTOCHECKBOX, 0,100,100,50, hwnd, 0, NULL, NULL); if (checkbox2 == NULL) return 0; } ListView = FindWindowEx(hwnd,NULL,_T("SysTreeView32"),NULL); if (ListView == NULL) ListView = FindWindowEx(hwnd,NULL,_T("SHBrowseForFolder ShellNameSpace Control"),NULL); if (ListView == NULL) return 0; //Gets the dimensions of the windows const int controlHeight = ::GetSystemMetrics(SM_CYMENUCHECK) + 4; GetWindowRect(hwnd,&Dialog); GetWindowRect(ListView,&ListViewRect); POINT pt; pt.x = ListViewRect.left; pt.y = ListViewRect.top; ScreenToClient(hwnd, &pt); ListViewRect.top = pt.y; ListViewRect.left = pt.x; pt.x = ListViewRect.right; pt.y = ListViewRect.bottom; ScreenToClient(hwnd, &pt); ListViewRect.bottom = pt.y; ListViewRect.right = pt.x; //Sets the list view controls dimensions SetWindowPos(ListView,0,ListViewRect.left, bSecondCheckbox ? ListViewRect.top+(2*controlHeight) : ListViewRect.top+controlHeight, (ListViewRect.right-ListViewRect.left), bSecondCheckbox ? (ListViewRect.bottom - ListViewRect.top)-(2*controlHeight) : (ListViewRect.bottom - ListViewRect.top)-controlHeight, SWP_NOZORDER); //Sets the window positions of checkbox and dialog controls SetWindowPos(checkbox,HWND_BOTTOM,ListViewRect.left, ListViewRect.top, (ListViewRect.right-ListViewRect.left), controlHeight, SWP_NOZORDER); if (bSecondCheckbox) { SetWindowPos(checkbox2,HWND_BOTTOM,ListViewRect.left, ListViewRect.top+controlHeight, (ListViewRect.right-ListViewRect.left), controlHeight, SWP_NOZORDER); } HWND label = FindWindowEx(hwnd, NULL, _T("STATIC"), NULL); if (label) { HFONT hFont = (HFONT)::SendMessage(label, WM_GETFONT, 0, 0); LOGFONT lf = {0}; GetObject(hFont, sizeof(lf), &lf); HFONT hf2 = CreateFontIndirect(&lf); ::SendMessage(checkbox, WM_SETFONT, (WPARAM)hf2, TRUE); if (bSecondCheckbox) ::SendMessage(checkbox2, WM_SETFONT, (WPARAM)hf2, TRUE); } else { //Sets the fonts of static controls SetFont(checkbox,_T("MS Sans Serif"),12); if (bSecondCheckbox) SetFont(checkbox2,_T("MS Sans Serif"),12); } // Subclass the checkbox control. CBProc = (WNDPROC) SetWindowLongPtr(checkbox,GWLP_WNDPROC, (LONG_PTR) CheckBoxSubclassProc); //Sets the checkbox to checked position SendMessage(checkbox,BM_SETCHECK,(WPARAM)m_bCheck,0); if (bSecondCheckbox) { CBProc = (WNDPROC) SetWindowLongPtr(checkbox2,GWLP_WNDPROC, (LONG_PTR) CheckBoxSubclassProc2); SendMessage(checkbox2,BM_SETCHECK,(WPARAM)m_bCheck,0); } // send a resize message to the resized list view control. Otherwise it won't show // up properly until the user resizes the window! SendMessage(ListView, WM_SIZE, SIZE_RESTORED, MAKELONG(ListViewRect.right-ListViewRect.left, bSecondCheckbox ? (ListViewRect.bottom - ListViewRect.top)-40 : (ListViewRect.bottom - ListViewRect.top)-20)); } // now set the default directory SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)(LPCTSTR)m_sDefaultPath); } if (uMsg == BFFM_SELCHANGED) { // Set the status window to the currently selected path. TCHAR szDir[MAX_PATH]; if (SHGetPathFromIDList((LPITEMIDLIST)lParam, szDir)) { SendMessage(hwnd,BFFM_SETSTATUSTEXT, 0, (LPARAM)szDir); } } return 0; }
void CJabberDlgGcJoin::OnInitDialog() { CSuper::OnInitDialog(); WindowSetIcon(m_hwnd, m_proto, "group"); JabberGcRecentInfo *pInfo = NULL; if (m_jid) pInfo = new JabberGcRecentInfo(m_proto, m_jid); else if(OpenClipboard(m_hwnd)) { HANDLE hData = GetClipboardData(CF_UNICODETEXT); if (hData) { TCHAR *buf = (TCHAR *)GlobalLock(hData); if (buf && _tcschr(buf, _T('@')) && !_tcschr(buf, _T(' '))) pInfo = new JabberGcRecentInfo(m_proto, buf); GlobalUnlock(hData); } CloseClipboard(); } if (pInfo) { pInfo->fillForm(m_hwnd); delete pInfo; } ptrT tszNick(m_proto->getTStringA("Nick")); if (tszNick == NULL) tszNick = JabberNickFromJID(m_proto->m_szJabberJID); SetDlgItemText(m_hwnd, IDC_NICK, tszNick); TEXTMETRIC tm = { 0 }; HDC hdc = GetDC(m_hwnd); GetTextMetrics(hdc, &tm); ReleaseDC(m_hwnd, hdc); sttTextLineHeight = tm.tmHeight; SendDlgItemMessage(m_hwnd, IDC_ROOM, CB_SETITEMHEIGHT, -1, sttTextLineHeight - 1); LOGFONT lf = { 0 }; HFONT hfnt = (HFONT)SendDlgItemMessage(m_hwnd, IDC_TXT_RECENT, WM_GETFONT, 0, 0); GetObject(hfnt, sizeof(lf), &lf); lf.lfWeight = FW_BOLD; SendDlgItemMessage(m_hwnd, IDC_TXT_RECENT, WM_SETFONT, (WPARAM)CreateFontIndirect(&lf), TRUE); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BM_SETIMAGE, IMAGE_ICON, (LPARAM)m_proto->LoadIconEx("bookmarks")); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONSETASFLATBTN, TRUE, 0); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONADDTOOLTIP, (WPARAM)"Bookmarks", 0); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONSETASPUSHBTN, TRUE, 0); m_proto->ComboLoadRecentStrings(m_hwnd, IDC_SERVER, "joinWnd_rcSvr"); int i; for (i = 0; i < 5; i++) { TCHAR jid[JABBER_MAX_JID_LEN]; JabberGcRecentInfo info(m_proto); if (!info.loadRecent(i)) break; mir_sntprintf(jid, _T("%s@%s (%s)"), info.m_room, info.m_server, info.m_nick ? info.m_nick : TranslateT("<no nick>")); SetDlgItemText(m_hwnd, IDC_RECENT1 + i, jid); } sttJoinDlgShowRecentItems(m_hwnd, i); }
INT_PTR CALLBACK CConfig::AppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { m_bInitializingDialog = true; // Translate the dialog TranslateDialogDefault(hwndDlg); CheckDlgButton(hwndDlg, IDC_SKIP_DRIVER_ERROR, m_abBoolSettings[SKIP_DRIVER_ERROR] ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SCREENSAVER_LOCK, m_abBoolSettings[SCREENSAVER_LOCK] ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_TRANSITIONS, m_abBoolSettings[TRANSITIONS] ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CONTROL_BACKLIGHTS, m_abBoolSettings[CONTROL_BACKLIGHTS] ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SHOW_LABELS, m_abBoolSettings[SHOW_LABELS] ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_HOOK_VOLUMEWHEEL, m_abBoolSettings[HOOK_VOLUMEWHEEL] ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_TIMESTAMP_SECONDS, m_abBoolSettings[TIMESTAMP_SECONDS] ? BST_CHECKED : BST_UNCHECKED); for(int i=0;i<FONT_SETTINGS;i++) { m_templogfont[i] = m_logfont[i]; SendDlgItemMessage(hwndDlg,CConfig::GetSampleField(i),WM_SETFONT,(WPARAM)m_hSampleFont[i],(LPARAM)true); } // fill device box CConfig::hDeviceBox = GetDlgItem(hwndDlg,IDC_DEVICE); FillDeviceBox(CConfig::hDeviceBox); m_bInitializingDialog = false; break; } case WM_NOTIFY: { switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { m_abBoolSettings[SKIP_DRIVER_ERROR] = IsDlgButtonChecked(hwndDlg,IDC_SKIP_DRIVER_ERROR) == BST_CHECKED ? true : false; m_abBoolSettings[SCREENSAVER_LOCK] = IsDlgButtonChecked(hwndDlg,IDC_SCREENSAVER_LOCK) == BST_CHECKED ? true : false; m_abBoolSettings[TRANSITIONS] = IsDlgButtonChecked(hwndDlg,IDC_TRANSITIONS) == BST_CHECKED ? true : false; m_abBoolSettings[SHOW_LABELS] = IsDlgButtonChecked(hwndDlg,IDC_SHOW_LABELS) == BST_CHECKED ? true : false; m_abBoolSettings[CONTROL_BACKLIGHTS] = IsDlgButtonChecked(hwndDlg,IDC_CONTROL_BACKLIGHTS) == BST_CHECKED ? true : false; m_abBoolSettings[HOOK_VOLUMEWHEEL] = IsDlgButtonChecked(hwndDlg,IDC_HOOK_VOLUMEWHEEL) == BST_CHECKED ? true : false; m_abBoolSettings[TIMESTAMP_SECONDS] = IsDlgButtonChecked(hwndDlg,IDC_TIMESTAMP_SECONDS) == BST_CHECKED ? true : false; m_aiIntSettings[DEVICE] = SendDlgItemMessage(hwndDlg,IDC_DEVICE,CB_GETCURSEL ,0,0); for(int i=0;i<FONT_SETTINGS;i++) m_logfont[i] = m_templogfont[i]; CConfig::SaveSettings(); SendMessage(hwndDlg, WM_INITDIALOG, 0, 0); break; } } break; } case WM_COMMAND: { if(LOWORD(wParam) == IDC_CREDITS) { CAppletManager::GetInstance()->ActivateCreditsScreen(); break; } int iFont = LOWORD(wParam); switch(iFont) { case IDC_CHOOSEFONT1: iFont = 0; break; case IDC_CHOOSEFONT2: iFont = 1; break; case IDC_CHOOSEFONT3: iFont = 2; break; case IDC_CHOOSEFONT4: iFont = 3; break; case IDC_CHOOSEFONT5: iFont = 4; break; default: iFont = -1; }; if(iFont >= 0) { CHOOSEFONT cf = { 0 }; cf.lStructSize = sizeof(cf); cf.hwndOwner = hwndDlg; cf.lpLogFont = &m_templogfont[iFont]; cf.Flags = CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS; if (ChooseFont(&cf)) { if(m_hSampleFont[iFont]) DeleteObject(m_hSampleFont[iFont]); m_hSampleFont[iFont] = CreateFontIndirect(&m_templogfont[iFont]); SendDlgItemMessage(hwndDlg,CConfig::GetSampleField(iFont),WM_SETFONT,(WPARAM)m_hSampleFont[iFont],(LPARAM)true); TRACE(_T("Font selected!")); } } if(LOWORD(wParam) == IDC_DEVICE && SendDlgItemMessage(hwndDlg,IDC_DEVICE,CB_GETCURSEL ,0,0) != m_aiIntSettings[DEVICE]) { SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } // Activate the apply button if (!m_bInitializingDialog && ((HIWORD(wParam) == EN_CHANGE) || (HIWORD(wParam) == BN_CLICKED))) { SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } break; } } return 0; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; RECT rc; TCHAR WndText[MAX_PATH]; DWORD Index; NONCLIENTMETRICS ncm; HFONT hFont; switch (message) { case WM_CREATE: hEditWnd = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_AUTOHSCROLL|ES_LEFT|ES_MULTILINE, 0, 0, 0, 0, hWnd, NULL, hInst, NULL); hDisplayWnd = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE, 0, 0, 0, 0, hWnd, NULL, hInst, NULL); memset(&ncm, 0, sizeof(NONCLIENTMETRICS)); ncm.cbSize = sizeof(NONCLIENTMETRICS); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0); hFont = CreateFontIndirect(&ncm.lfMessageFont); SendMessage(hEditWnd, WM_SETFONT, (WPARAM)hFont, TRUE); SendMessage(hDisplayWnd, WM_SETFONT, (WPARAM)hFont, TRUE); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); if (lParam == (LPARAM)hEditWnd && wmEvent == EN_CHANGE) { GetWindowText(hEditWnd, WndText, MAX_PATH); if (_tcslen(WndText) > 0) { SetWindowText(hEditWnd, TEXT("")); if (!bConnected) { MessageBox(hWnd, TEXT("You are not currently connected!"), TEXT("Error"), MB_OK|MB_ICONSTOP); break; } for (Index=0; Index<_tcslen(WndText); Index++) { if (dwThreadId != 0) { PostThreadMessage(dwThreadId, WM_CHAR, (WPARAM)WndText[Index], (LPARAM)0); } } } } // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; case IDM_FILE_CLEARDISPLAY: SetWindowText(hDisplayWnd, TEXT("")); break; case IDM_FILE_CONNECT: if (bConnected) { MessageBox(hWnd, TEXT("You are already connected!"), TEXT("Error"), MB_OK|MB_ICONSTOP); } else { if (DialogBox(hInst, (LPCTSTR)IDD_CONNECTION, hWnd, (DLGPROC)ConnectionDialogProc) == IDOK) { bConnected = TRUE; EnableFileMenuItemByID(IDM_FILE_DISCONNECT, TRUE); EnableFileMenuItemByID(IDM_FILE_CONNECT, FALSE); _beginthread(Rs232Thread, 0, NULL); } } break; case IDM_FILE_DISCONNECT: if (bConnected) { bConnected = FALSE; EnableFileMenuItemByID(IDM_FILE_DISCONNECT, FALSE); EnableFileMenuItemByID(IDM_FILE_CONNECT, TRUE); } else { MessageBox(hWnd, TEXT("You are not currently connected!"), TEXT("Error"), MB_OK|MB_ICONSTOP); } break; case IDM_FILE_STARTCAPTURE: if (DialogBox(hInst, (LPCTSTR)IDD_CAPTURE, hWnd, (DLGPROC)CaptureDialogProc) == IDOK) { bCapturing = TRUE; EnableFileMenuItemByID(IDM_FILE_STOPCAPTURE, TRUE); EnableFileMenuItemByID(IDM_FILE_STARTCAPTURE, FALSE); hCaptureFile = CreateFile(strCaptureFileName, FILE_APPEND_DATA, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); } break; case IDM_FILE_STOPCAPTURE: if (bCapturing) { bCapturing = FALSE; EnableFileMenuItemByID(IDM_FILE_STOPCAPTURE, FALSE); EnableFileMenuItemByID(IDM_FILE_STARTCAPTURE, TRUE); CloseHandle(hCaptureFile); hCaptureFile = NULL; } break; case IDM_FILE_LOCALECHO: if (bLocalEcho) { bLocalEcho = FALSE; CheckLocalEchoMenuItem(bLocalEcho); } else { bLocalEcho = TRUE; CheckLocalEchoMenuItem(bLocalEcho); } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; case WM_SIZE: GetClientRect(hWnd, &rc); MoveWindow(hDisplayWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top - 20, TRUE); MoveWindow(hEditWnd, rc.left, rc.bottom - 20, rc.right - rc.left, 20, TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
/****************************************************************************** * * FUNCTION: GetPositionSettings * * PURPOSE: Reads the Registry to get the last-set window position. * ******************************************************************************/ VOID GetPositionSettings() { HKEY hKey; DWORD ParamSize, newPosSize; LOGFONT lf; int i; POSITION_SETTINGS newPositionInfo; char *nextString; char recentExList[(MAXFILTERLEN+1) * NUMRECENTFILTERS + 1]; char recentInList[(MAXFILTERLEN+1) * NUMRECENTFILTERS + 1]; char recentHiList[(MAXFILTERLEN+1) * NUMRECENTFILTERS + 1]; // Delete old settings RegDeleteKey( HKEY_CURRENT_USER, "Software\\Systems Internals\\Regmon" ); memset( &newPositionInfo , 0, sizeof( newPositionInfo )); // Default font GetObject( GetStockObject(SYSTEM_FONT), sizeof lf, &lf ); lf.lfWeight = FW_NORMAL; lf.lfHeight = 8; lf.lfWidth = 0; strcpy( lf.lfFaceName, TEXT("MS Sans Serif") ); PositionInfo.font = lf; // Fist, set the default settings PositionInfo.top = 100; PositionInfo.left = 100; PositionInfo.width = 600; PositionInfo.height = 300; PositionInfo.maximized = FALSE; PositionInfo.highlightfg = 0x00FFFFFF; PositionInfo.highlightbg = 0x000000FF; PositionInfo.logerror = TRUE; PositionInfo.logsuccess = TRUE; PositionInfo.logwrites = TRUE; PositionInfo.logreads = TRUE; PositionInfo.logaux = TRUE; PositionInfo.ontop = FALSE; // set the default listview widths PositionInfo.column[0] = 35; PositionInfo.column[1] = 90; PositionInfo.column[2] = 70; PositionInfo.column[3] = 70; PositionInfo.column[4] = 200; PositionInfo.column[5] = 50; PositionInfo.column[6] = 70; // Clear the recent arrays recentInList[0] = '*'; recentInList[1] = 0; recentInList[2] = 0; recentExList[0] = 0; recentHiList[0] = 0; memset( RecentExFilters, 0, sizeof( RecentExFilters )); memset( RecentInFilters, 0, sizeof( RecentInFilters )); memset( RecentHiFilters, 0, sizeof( RecentHiFilters )); // set the default history depth (infinite) PositionInfo.historydepth = 0; // get the params and ignore errors RegCreateKey(HKEY_CURRENT_USER, REGMON_SETTINGS_KEY, &hKey ); newPosSize = sizeof( PositionInfo ); newPositionInfo.posversion = 0; RegQueryValueEx( hKey,REGMON_SETTINGS_VALUE, NULL, NULL, (LPBYTE) &newPositionInfo, &newPosSize ); ParamSize = sizeof( recentInList ); RegQueryValueEx( hKey,REGMON_RECENT_INFILTER_VALUE, NULL, NULL, (LPBYTE) &recentInList, &ParamSize ); ParamSize = sizeof( recentExList ); RegQueryValueEx( hKey,REGMON_RECENT_EXFILTER_VALUE, NULL, NULL, (LPBYTE) &recentExList, &ParamSize ); ParamSize = sizeof( recentHiList ); RegQueryValueEx( hKey,REGMON_RECENT_HIFILTER_VALUE, NULL, NULL, (LPBYTE) &recentHiList, &ParamSize ); CloseHandle( hKey ); // See if we have new position info if( newPositionInfo.posversion == POSITION_VERSION && newPosSize == sizeof(PositionInfo)) { PositionInfo = newPositionInfo; } // extract the history depth MaxLines = PositionInfo.historydepth; OnTop = PositionInfo.ontop; ClockTime = PositionInfo.clocktime; ShowMs = PositionInfo.showms; // get font LogFont = PositionInfo.font; hFont = CreateFontIndirect( &LogFont ); // set highlight colors HighlightFg = PositionInfo.highlightfg; HighlightBg = PositionInfo.highlightbg; // get misc device filter FilterDefinition.logsuccess = PositionInfo.logsuccess; FilterDefinition.logerror = PositionInfo.logerror; FilterDefinition.logreads = PositionInfo.logreads; FilterDefinition.logwrites = PositionInfo.logwrites; FilterDefinition.logaux = PositionInfo.logaux; // Get the recent filter lists nextString = recentInList; i = 0; while( *nextString ) { strcpy( RecentInFilters[i++], nextString ); nextString = &nextString[strlen(nextString)+1]; } nextString = recentExList; i = 0; while( *nextString ) { strcpy( RecentExFilters[i++], nextString ); nextString = &nextString[strlen(nextString)+1]; } nextString = recentHiList; i = 0; while( *nextString ) { strcpy( RecentHiFilters[i++], nextString ); nextString = &nextString[strlen(nextString)+1]; } strcpy( FilterString, RecentInFilters[0] ); strupr( FilterString ); strcpy( ExcludeString, RecentExFilters[0] ); strupr( ExcludeString ); strcpy( HighlightString, RecentHiFilters[0] ); strupr( HighlightString ); }
void CJabberDlgGcJoin::OnInitDialog() { CSuper::OnInitDialog(); WindowSetIcon( m_hwnd, m_proto, "group" ); JabberGcRecentInfo *info = NULL; if ( m_jid ) info = new JabberGcRecentInfo( m_proto, m_jid ); else { OpenClipboard(m_hwnd); #ifdef UNICODE HANDLE hData = GetClipboardData(CF_UNICODETEXT); #else HANDLE hData = GetClipboardData(CF_TEXT); #endif if (hData) { TCHAR *buf = (TCHAR *)GlobalLock(hData); if (buf && _tcschr(buf, _T('@')) && !_tcschr(buf, _T(' '))) info = new JabberGcRecentInfo( m_proto, buf ); GlobalUnlock(hData); } CloseClipboard(); } if (info) { info->fillForm(m_hwnd); delete info; } DBVARIANT dbv; if ( !m_proto->JGetStringT( NULL, "Nick", &dbv )) { SetDlgItemText( m_hwnd, IDC_NICK, dbv.ptszVal ); JFreeVariant( &dbv ); } else { TCHAR* nick = JabberNickFromJID( m_proto->m_szJabberJID ); SetDlgItemText( m_hwnd, IDC_NICK, nick ); mir_free( nick ); } { TEXTMETRIC tm = {0}; HDC hdc = GetDC(m_hwnd); GetTextMetrics(hdc, &tm); ReleaseDC(m_hwnd, hdc); sttTextLineHeight = tm.tmHeight; SendDlgItemMessage(m_hwnd, IDC_ROOM, CB_SETITEMHEIGHT, -1, sttTextLineHeight-1); } { LOGFONT lf = {0}; HFONT hfnt = (HFONT)SendDlgItemMessage(m_hwnd, IDC_TXT_RECENT, WM_GETFONT, 0, 0); GetObject(hfnt, sizeof(lf), &lf); lf.lfWeight = FW_BOLD; SendDlgItemMessage(m_hwnd, IDC_TXT_RECENT, WM_SETFONT, (WPARAM)CreateFontIndirect(&lf), TRUE); } SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BM_SETIMAGE, IMAGE_ICON, (LPARAM)m_proto->LoadIconEx("bookmarks")); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONSETASFLATBTN, 0, 0); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONADDTOOLTIP, (WPARAM)"Bookmarks", 0); SendDlgItemMessage(m_hwnd, IDC_BOOKMARKS, BUTTONSETASPUSHBTN, 0, 0); m_proto->ComboLoadRecentStrings(m_hwnd, IDC_SERVER, "joinWnd_rcSvr"); int i = 0; for ( ; i < 5; ++i) { TCHAR jid[JABBER_MAX_JID_LEN]; JabberGcRecentInfo info( m_proto ); if (info.loadRecent(i)) { mir_sntprintf(jid, SIZEOF(jid), _T("%s@%s (%s)"), info.room, info.server, info.nick ? info.nick : TranslateT("<no nick>") ); SetDlgItemText(m_hwnd, IDC_RECENT1+i, jid); } else { break; } } sttJoinDlgShowRecentItems(m_hwnd, i); }
int fb_PrinterOpen( DEV_LPT_INFO *devInfo, int iPort, const char *pszDevice ) { int result = fb_ErrorSetNum( FB_RTERROR_OK ); const DEV_PRINTER_EMU_MODE *pFoundEmu = NULL; DWORD dwJob = 0; BOOL fResult; HANDLE hPrinter = NULL; HDC hDc = NULL; char *printer_name = NULL; char *doc_title = NULL; DEV_LPT_PROTOCOL *lpt_proto; if ( !fb_DevLptParseProtocol( &lpt_proto, pszDevice, strlen(pszDevice), TRUE ) ) { if( lpt_proto!=NULL ) free(lpt_proto); return fb_ErrorSetNum( FB_RTERROR_ILLEGALFUNCTIONCALL ); } /* Allow only valid emulation modes */ if( *lpt_proto->emu!=0 ) { int i; for( i=0; i!=sizeof(aEmulationModes)/sizeof(aEmulationModes[0]); ++i ) { const DEV_PRINTER_EMU_MODE *pEmu = aEmulationModes + i; if( strcasecmp( lpt_proto->emu, pEmu->pszId )==0 ) { pFoundEmu = pEmu; break; } } if( !pFoundEmu ) { if( lpt_proto!=NULL ) free(lpt_proto); return fb_ErrorSetNum( FB_RTERROR_ILLEGALFUNCTIONCALL ); } } if( iPort==0 ) { /* LPT:[PrinterName] */ if( *lpt_proto->name ) { printer_name = strdup( lpt_proto->name ); } else { printer_name = GetDefaultPrinterName(); } } else { /* LPTx: */ FB_LIST dev_printer_devs; DEV_PRINTER_DEVICE* node; fb_hListDevInit( &dev_printer_devs ); fb_hPrinterBuildList( &dev_printer_devs ); /* Find printer attached to specified device */ node = fb_hListDevFindDevice( &dev_printer_devs, lpt_proto->proto ); if( node!=NULL ) { printer_name = strdup( node->printer_name ); } fb_hListDevClear( &dev_printer_devs ); } if( printer_name == NULL ) { result = fb_ErrorSetNum( FB_RTERROR_FILENOTFOUND ); } else { if( *lpt_proto->emu!= '\0' ) { /* When EMULATION is used, we have to use the DC instead of * the PRINTER directly */ hDc = CreateDCA( "WINSPOOL", printer_name, NULL, NULL ); fResult = hDc!=NULL; } else { /* User PRINTER directly */ fResult = OpenPrinter(printer_name, &hPrinter, NULL); } if( !fResult ) { result = fb_ErrorSetNum( FB_RTERROR_FILENOTFOUND ); } } if( lpt_proto->title && *lpt_proto->title ) { doc_title = strdup( lpt_proto->title ); } else { doc_title = strdup( "FreeBASIC document" ); } if( result==FB_RTERROR_OK ) { if( *lpt_proto->emu!= '\0' ) { int iJob; DOCINFO docInfo; memset( &docInfo, 0, sizeof(DOCINFO) ); docInfo.cbSize = sizeof(DOCINFO); docInfo.lpszDocName = doc_title; iJob = StartDoc( hDc, &docInfo ); if( iJob <= 0 ) { result = fb_ErrorSetNum( FB_RTERROR_FILEIO ); } else { dwJob = (DWORD) iJob; } } else { DOC_INFO_1 DocInfo; DocInfo.pDocName = doc_title; DocInfo.pOutputFile = NULL; DocInfo.pDatatype = TEXT("RAW"); dwJob = StartDocPrinter( hPrinter, 1, (BYTE*) &DocInfo ); if( dwJob==0 ) { result = fb_ErrorSetNum( FB_RTERROR_FILEIO ); } } } if( result==FB_RTERROR_OK ) { W32_PRINTER_INFO *pInfo = calloc( 1, sizeof(W32_PRINTER_INFO) ); if( pInfo==NULL ) { result = fb_ErrorSetNum( FB_RTERROR_OUTOFMEM ); } else { devInfo->driver_opaque = pInfo; pInfo->hPrinter = hPrinter; pInfo->dwJob = dwJob; pInfo->hDc = hDc; if( hDc!=NULL ) { LOGFONT lf; pInfo->Emu.dwFullSizeX = GetDeviceCaps( hDc, PHYSICALWIDTH ); pInfo->Emu.dwFullSizeY = GetDeviceCaps( hDc, PHYSICALHEIGHT ); pInfo->Emu.dwSizeX = GetDeviceCaps( hDc, HORZRES ); pInfo->Emu.dwSizeY = GetDeviceCaps( hDc, VERTRES ); pInfo->Emu.dwOffsetX = GetDeviceCaps( hDc, PHYSICALOFFSETX ); pInfo->Emu.dwOffsetY = GetDeviceCaps( hDc, PHYSICALOFFSETY ); pInfo->Emu.dwDPI_X = GetDeviceCaps( hDc, LOGPIXELSX ); pInfo->Emu.dwDPI_Y = GetDeviceCaps( hDc, LOGPIXELSY ); #if 0 pInfo->Emu.dwCurrentX = pInfo->Emu.dwOffsetX; pInfo->Emu.dwCurrentY = pInfo->Emu.dwOffsetY; #else pInfo->Emu.dwCurrentX = 0; pInfo->Emu.dwCurrentY = 0; #endif pInfo->Emu.clFore = RGB(0,0,0); pInfo->Emu.clBack = RGB(255,255,255); /* Start in 12 CPI monospace mode */ EmuBuild_LOGFONT( &lf, pInfo, 12 ); /* Should never fail - except when some default fonts were * removed by hand (which is very unlikely) */ pInfo->Emu.hFont = CreateFontIndirect( &lf ); DBG_ASSERT( pInfo->Emu.hFont!=NULL ); /* Register PRINT function */ pInfo->Emu.pfnPrint = pFoundEmu->pfnPrint; /* Should not be necessary because this is the default */ SetTextAlign( hDc, TA_TOP | TA_LEFT | TA_NOUPDATECP ); EmuUpdateInfo( pInfo ); } } } if( result!=FB_RTERROR_OK ) { if( dwJob!=0 ) { if( *lpt_proto->emu != '\0' ) { EndDoc( hDc ); } else { EndDocPrinter( hPrinter ); } } if( hPrinter!=NULL ) { ClosePrinter( hPrinter ); } if( hDc!=NULL ) { DeleteDC( hDc ); } } if( printer_name!=NULL ) free( printer_name ); if( doc_title!=NULL ) free( doc_title ); if( lpt_proto!=NULL ) free(lpt_proto); return result; }
LRESULT CALLBACK LConProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND view; HDC hdc; HBRUSH hbr; HGDIOBJ oldfont; RECT rect; int titlelen; SIZE size; LOGFONT lf; TEXTMETRIC tm; HINSTANCE inst = (HINSTANCE)(LONG_PTR)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); DRAWITEMSTRUCT *drawitem; CHARFORMAT2W format; switch (msg) { case WM_CREATE: // Create game title static control memset (&lf, 0, sizeof(lf)); hdc = GetDC (hWnd); lf.lfHeight = -MulDiv(12, GetDeviceCaps(hdc, LOGPIXELSY), 72); lf.lfCharSet = ANSI_CHARSET; lf.lfWeight = FW_BOLD; lf.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN; strcpy (lf.lfFaceName, "Trebuchet MS"); GameTitleFont = CreateFontIndirect (&lf); oldfont = SelectObject (hdc, GetStockObject (DEFAULT_GUI_FONT)); GetTextMetrics (hdc, &tm); DefaultGUIFontHeight = tm.tmHeight; if (GameTitleFont == NULL) { GameTitleFontHeight = DefaultGUIFontHeight; } else { SelectObject (hdc, GameTitleFont); GetTextMetrics (hdc, &tm); GameTitleFontHeight = tm.tmHeight; } SelectObject (hdc, oldfont); // Create log read-only edit control view = CreateWindowEx (WS_EX_NOPARENTNOTIFY, "RichEdit20W", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | WS_CLIPSIBLINGS, 0, 0, 0, 0, hWnd, NULL, inst, NULL); HRESULT hr; hr = GetLastError(); if (view == NULL) { ReleaseDC (hWnd, hdc); return -1; } SendMessage (view, EM_SETREADONLY, TRUE, 0); SendMessage (view, EM_EXLIMITTEXT, 0, 0x7FFFFFFE); SendMessage (view, EM_SETBKGNDCOLOR, 0, RGB(70,70,70)); // Setup default font for the log. //SendMessage (view, WM_SETFONT, (WPARAM)GetStockObject (DEFAULT_GUI_FONT), FALSE); format.cbSize = sizeof(format); format.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_SIZE | CFM_CHARSET; format.dwEffects = 0; format.yHeight = 200; format.crTextColor = RGB(223,223,223); format.bCharSet = ANSI_CHARSET; format.bPitchAndFamily = FF_SWISS | VARIABLE_PITCH; wcscpy(format.szFaceName, L"DejaVu Sans"); // At least I have it. :p SendMessageW(view, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&format); ConWindow = view; ReleaseDC (hWnd, hdc); view = CreateWindowEx (WS_EX_NOPARENTNOTIFY, "STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW, 0, 0, 0, 0, hWnd, NULL, inst, NULL); if (view == NULL) { return -1; } SetWindowLong (view, GWL_ID, IDC_STATIC_TITLE); GameTitleWindow = view; return 0; case WM_SIZE: if (wParam != SIZE_MAXHIDE && wParam != SIZE_MAXSHOW) { LayoutMainWindow (hWnd, ErrorPane); } return 0; case WM_DRAWITEM: // Draw title banner. if (wParam == IDC_STATIC_TITLE && DoomStartupInfo.Name.IsNotEmpty()) { const PalEntry *c; // Draw the game title strip at the top of the window. drawitem = (LPDRAWITEMSTRUCT)lParam; // Draw the background. rect = drawitem->rcItem; rect.bottom -= 1; c = (const PalEntry *)&DoomStartupInfo.BkColor; hbr = CreateSolidBrush (RGB(c->r,c->g,c->b)); FillRect (drawitem->hDC, &drawitem->rcItem, hbr); DeleteObject (hbr); // Calculate width of the title string. SetTextAlign (drawitem->hDC, TA_TOP); oldfont = SelectObject (drawitem->hDC, GameTitleFont != NULL ? GameTitleFont : (HFONT)GetStockObject (DEFAULT_GUI_FONT)); titlelen = (int)DoomStartupInfo.Name.Len(); GetTextExtentPoint32 (drawitem->hDC, DoomStartupInfo.Name, titlelen, &size); // Draw the title. c = (const PalEntry *)&DoomStartupInfo.FgColor; SetTextColor (drawitem->hDC, RGB(c->r,c->g,c->b)); SetBkMode (drawitem->hDC, TRANSPARENT); TextOut (drawitem->hDC, rect.left + (rect.right - rect.left - size.cx) / 2, 2, DoomStartupInfo.Name, titlelen); SelectObject (drawitem->hDC, oldfont); return TRUE; } // Draw startup screen else if (wParam == IDC_STATIC_STARTUP) { if (StartupScreen != NULL) { drawitem = (LPDRAWITEMSTRUCT)lParam; rect = drawitem->rcItem; // Windows expects DIBs to be bottom-up but ours is top-down, // so flip it vertically while drawing it. StretchDIBits (drawitem->hDC, rect.left, rect.bottom - 1, rect.right - rect.left, rect.top - rect.bottom, 0, 0, StartupBitmap->bmiHeader.biWidth, StartupBitmap->bmiHeader.biHeight, ST_Util_BitsForBitmap(StartupBitmap), StartupBitmap, DIB_RGB_COLORS, SRCCOPY); // If the title banner is gone, then this is an ENDOOM screen, so draw a short prompt // where the command prompt would have been in DOS. if (GameTitleWindow == NULL) { static const char QuitText[] = "Press any key or click anywhere in the window to quit."; SetTextColor (drawitem->hDC, RGB(240,240,240)); SetBkMode (drawitem->hDC, TRANSPARENT); oldfont = SelectObject (drawitem->hDC, (HFONT)GetStockObject (DEFAULT_GUI_FONT)); TextOut (drawitem->hDC, 3, drawitem->rcItem.bottom - DefaultGUIFontHeight - 3, QuitText, countof(QuitText)-1); SelectObject (drawitem->hDC, oldfont); } return TRUE; } } // Draw stop icon. else if (wParam == IDC_ICONPIC) { HICON icon; POINTL char_pos; drawitem = (LPDRAWITEMSTRUCT)lParam; // This background color should match the edit control's. hbr = CreateSolidBrush (RGB(70,70,70)); FillRect (drawitem->hDC, &drawitem->rcItem, hbr); DeleteObject (hbr); // Draw the icon aligned with the first line of error text. SendMessage (ConWindow, EM_POSFROMCHAR, (WPARAM)&char_pos, ErrorIconChar); icon = (HICON)LoadImage (0, IDI_ERROR, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); DrawIcon (drawitem->hDC, 6, char_pos.y, icon); return TRUE; } return FALSE; case WM_COMMAND: if (ErrorIcon != NULL && (HWND)lParam == ConWindow && HIWORD(wParam) == EN_UPDATE) { // Be sure to redraw the error icon if the edit control changes. InvalidateRect (ErrorIcon, NULL, TRUE); return 0; } break; case WM_CLOSE: PostQuitMessage (0); break; case WM_DESTROY: if (GameTitleFont != NULL) { DeleteObject (GameTitleFont); } break; } return DefWindowProc (hWnd, msg, wParam, lParam); }
void LoadSettings(void) { HKEY hKey = NULL; HFONT hFont; DWORD dwPointSize = 0; INT base_length, dx, dy; base_length = (GetSystemMetrics(SM_CXSCREEN) > GetSystemMetrics(SM_CYSCREEN)) ? GetSystemMetrics(SM_CYSCREEN) : GetSystemMetrics(SM_CXSCREEN); dx = (INT)(base_length * .95); dy = dx * 3 / 4; SetRect(&Globals.main_rect, 0, 0, dx, dy); if (RegOpenKey(HKEY_CURRENT_USER, s_szRegistryKey, &hKey) == ERROR_SUCCESS) { QueryByte(hKey, _T("lfCharSet"), &Globals.lfFont.lfCharSet); QueryByte(hKey, _T("lfClipPrecision"), &Globals.lfFont.lfClipPrecision); QueryDword(hKey, _T("lfEscapement"), (DWORD*)&Globals.lfFont.lfEscapement); QueryString(hKey, _T("lfFaceName"), Globals.lfFont.lfFaceName, sizeof(Globals.lfFont.lfFaceName) / sizeof(Globals.lfFont.lfFaceName[0])); QueryByte(hKey, _T("lfItalic"), &Globals.lfFont.lfItalic); QueryDword(hKey, _T("lfOrientation"), (DWORD*)&Globals.lfFont.lfOrientation); QueryByte(hKey, _T("lfOutPrecision"), &Globals.lfFont.lfOutPrecision); QueryByte(hKey, _T("lfPitchAndFamily"), &Globals.lfFont.lfPitchAndFamily); QueryByte(hKey, _T("lfQuality"), &Globals.lfFont.lfQuality); QueryByte(hKey, _T("lfStrikeOut"), &Globals.lfFont.lfStrikeOut); QueryByte(hKey, _T("lfUnderline"), &Globals.lfFont.lfUnderline); QueryDword(hKey, _T("lfWeight"), (DWORD*)&Globals.lfFont.lfWeight); QueryDword(hKey, _T("iPointSize"), &dwPointSize); QueryBool(hKey, _T("fWrap"), &Globals.bWrapLongLines); QueryBool(hKey, _T("fStatusBar"), &Globals.bShowStatusBar); QueryString(hKey, _T("szHeader"), Globals.szHeader, sizeof(Globals.szHeader) / sizeof(Globals.szHeader[0])); QueryString(hKey, _T("szTrailer"), Globals.szFooter, sizeof(Globals.szFooter) / sizeof(Globals.szFooter[0])); QueryDword(hKey, _T("iMarginLeft"), (DWORD*)&Globals.lMarginLeft); QueryDword(hKey, _T("iMarginTop"), (DWORD*)&Globals.lMarginTop); QueryDword(hKey, _T("iMarginRight"), (DWORD*)&Globals.lMarginRight); QueryDword(hKey, _T("iMarginBottom"), (DWORD*)&Globals.lMarginBottom); QueryDword(hKey, _T("iWindowPosX"), (DWORD*)&Globals.main_rect.left); QueryDword(hKey, _T("iWindowPosY"), (DWORD*)&Globals.main_rect.top); QueryDword(hKey, _T("iWindowPosDX"), (DWORD*)&dx); QueryDword(hKey, _T("iWindowPosDY"), (DWORD*)&dy); Globals.main_rect.right = Globals.main_rect.left + dx; Globals.main_rect.bottom = Globals.main_rect.top + dy; /* invert value because DIALOG_ViewStatusBar will be called to show it */ Globals.bShowStatusBar = !Globals.bShowStatusBar; if (dwPointSize != 0) Globals.lfFont.lfHeight = HeightFromPointSize(dwPointSize); RegCloseKey(hKey); } hFont = CreateFontIndirect(&Globals.lfFont); if (hFont) { if (Globals.hFont) DeleteObject(Globals.hFont); Globals.hFont = hFont; } }
LRESULT CALLBACK BrowseProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static HFONT font; LV_ITEM item; POINT pt; LV_COLUMN lvC; RECT r; int i; LPNMHDR nmh; static LVITEM pressed; switch (iMessage) { case WM_USER+1: { DWINFO info; char *q; memset(&info,0, sizeof(info)); strcpy(info.dwName, browselist[pressed.lParam]->file); q = strrchr(info.dwName, '\\'); if (q) strcpy(info.dwTitle, q + 1); else strcpy(info.dwTitle, info.dwName); info.dwLineNo = TagNewLine(browselist[pressed.lParam]->file, browselist[pressed.lParam]->line); info.logMRU = FALSE; info.newFile = FALSE; CreateDrawWindow(&info, TRUE); break; } case WM_CTLCOLORSTATIC: { return (LRESULT)(HBRUSH)(COLOR_INACTIVECAPTION + 1); } case WM_CTLCOLORBTN: { return (LRESULT)GetStockObject(NULL_BRUSH); } case WM_NOTIFY: nmh = (LPNMHDR)lParam; if (nmh->code == NM_SETFOCUS) { PostMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0); SendMessage(GetParent(hwnd), WM_ACTIVATEME, 0, 0); } else if (nmh->code == LVN_GETDISPINFO) { LV_DISPINFO *p = (LV_DISPINFO *)lParam; char name[512] = "", *q; switch (p->item.iSubItem) { case 1: /* id*/ sprintf(name,"%d", p->item.lParam +1); break; case 2: /*name*/ strcpy(name, browselist[p->item.lParam]->name); break; case 3: /* browse */ sprintf(name, "%d", browselist[p->item.lParam]->line); break; case 4: /*file*/ q = strrchr(browselist[p->item.lParam]->file, '\\'); if (!q) q = browselist[p->item.lParam]->file; else q++; strcpy(name, q); break; } if (name[0]) { p->item.mask |= LVIF_TEXT | LVIF_DI_SETITEM; p->item.mask &= ~LVIF_STATE; p->item.pszText = name; } } else if (((LPNMHDR)lParam)->code == NM_DBLCLK) { LVHITTESTINFO hittest; GetCursorPos(&hittest.pt); ScreenToClient(hwndLV, &hittest.pt); if (ListView_SubItemHitTest(hwndLV, &hittest) >= 0) { LVITEM lvitem; lvitem.iItem = hittest.iItem; lvitem.iSubItem = 0; lvitem.mask = LVIF_PARAM; ListView_GetItem(hwndLV, &lvitem); memcpy(&pressed, &lvitem, sizeof(pressed)); SendMessage(hwnd, WM_USER + 1, 0, 0); } } else if (nmh->code == LVN_KEYDOWN) { switch (((LPNMLVKEYDOWN)lParam)->wVKey) { case 'C': if (GetKeyState(VK_CONTROL) &0x80000000) { CopyText(hwnd); } break; case VK_UP: if (curSel > 0) SendMessage(hwnd, WM_USER, curSel-1, 0); break; case VK_DOWN: if (curSel < ListView_GetItemCount(hwndLV) - 1) SendMessage(hwnd, WM_USER, curSel + 1, 0); break; } } break; case WM_COMMAND: switch(wParam) { case IDC_RETURN: GetWindowText(hwndEdit, brsName, sizeof(brsName)); SendMessage(hwndCombo, WM_SAVEHISTORY, 0, 0); CreateUsageList(); return 0; case IDC_ESCAPE: SendMessage(hwndEdit, WM_SETTEXT, 0, (LPARAM)brsName); return 0; default: if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == 300) { displayFull = !displayFull; PostMessage(hwnd, WM_USER, 0, 0); } if (HIWORD(wParam) == CBN_SELENDOK && LOWORD(wParam) == 500) { PostMessage(hwnd, WM_COMMAND, IDC_RETURN, 0); } break; } break; case WM_USER: { int k = 0; char buf[40]; sprintf(buf, "%d Usages", browsecount); SetWindowText(hwndButton, buf); ListView_DeleteAllItems(hwndLV); memset(&item, 0, sizeof(item)); for (i=0; i < browsecount; i++) { if (displayFull || browselist[i]->definition || browselist[i]->declaration) { item.iItem = k++; item.iSubItem = 0; item.mask = LVIF_IMAGE | LVIF_PARAM; item.lParam = i; item.iImage = browselist[i]->definition ? 0 : browselist[i]->declaration ? 1 : 2; ListView_InsertItem(hwndLV, &item); } } } break; case WM_DRAWITEM: { LPDRAWITEMSTRUCT pDis = (LPDRAWITEMSTRUCT)lParam; HDC memdc; char staticText[256]; BOOL state = !! displayFull; int len = SendMessage(pDis->hwndItem, WM_GETTEXT, sizeof(staticText), (LPARAM)staticText); SIZE sz; RECT r; POINT textpos, iconpos; GetClientRect(pDis->hwndItem, &r); GetTextExtentPoint32(pDis->hDC, staticText, len, &sz); SetBkMode(pDis->hDC, TRANSPARENT); iconpos.x = 4; iconpos.y = (r.bottom - r.top - 16)/2; textpos.x = r.right - 4 - sz.cx; textpos.y = (r.bottom - r.top - sz.cy)/2; DrawFrameControl(pDis->hDC, &pDis->rcItem, DFC_BUTTON, DFCS_BUTTONPUSH | (state ? DFCS_PUSHED : 0)); TextOut(pDis->hDC, pDis->rcItem.left+ textpos.x, pDis->rcItem.top+textpos.y, staticText, len); memdc = CreateCompatibleDC(pDis->hDC); SelectObject(memdc, buttonbmp); TransparentBlt(pDis->hDC, pDis->rcItem.left+ iconpos.x, pDis->rcItem.top+iconpos.y, 16, 16, memdc, 0, 0, 16, 16, 0xc0c0c0); DeleteDC(memdc); } return 0; case WM_CREATE: hwndBrowse = hwnd; GetClientRect(hwnd, &r); hwndBackground = CreateWindow("static", "", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 0,0, r.right - r.bottom, BUTTONHEIGHT + 4, hwnd, 0, hInstance, 0); hwndButton = CreateWindow("button", "0 Usages", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 2,2,BUTTONWIDTH,BUTTONHEIGHT, hwnd, (HMENU)300, hInstance, 0); ApplyDialogFont(hwndButton); hwndCombo = CreateWindow("COMBOBOX", "", WS_CHILD + WS_CLIPSIBLINGS + WS_BORDER + WS_VISIBLE + CBS_DROPDOWN + CBS_AUTOHSCROLL, BUTTONWIDTH + 10, 4, 200, 100, hwnd, (HMENU)500, hInstance, 0); ApplyDialogFont(hwndCombo); SubClassHistoryCombo(hwndCombo); SendMessage(hwndCombo, WM_SETHISTORY, 0, (LPARAM)varinfohist); pt.x = pt.y = 5; hwndEdit = ChildWindowFromPoint(hwndCombo, pt); oldproc = (WNDPROC)SetWindowLong(hwndEdit, GWL_WNDPROC, (int)EditHook); BringWindowToTop(hwndButton); BringWindowToTop(hwndCombo); font = CreateFontIndirect(&systemDialogFont); SendMessage(hwndErrButton, WM_SETFONT, (WPARAM)font, 0); SendMessage(hwndWarnButton, WM_SETFONT, (WPARAM)font, 0); hwndLV = CreateWindowEx(0, WC_LISTVIEW, "", LVS_REPORT | LVS_SINGLESEL | WS_CHILD | WS_VISIBLE | WS_BORDER, 0,BUTTONHEIGHT + 4,r.right-r.left, r.bottom - r.top-BUTTONHEIGHT-4, hwnd, 0, hInstance, 0); ListView_SetExtendedListViewStyle(hwndLV, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_DOUBLEBUFFER); ApplyDialogFont(hwndLV); GetWindowRect(hwndLV, &r); lvC.mask = LVCF_WIDTH; lvC.cx = 50; lvC.iSubItem = 0; ListView_InsertColumn(hwndLV, 0, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 50; lvC.iSubItem = 1; lvC.pszText = "Id"; ListView_InsertColumn(hwndLV, 1, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 250; lvC.iSubItem = 2; lvC.pszText = "Name"; ListView_InsertColumn(hwndLV, 2, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 50; lvC.iSubItem = 3; lvC.pszText = "Line"; ListView_InsertColumn(hwndLV, 3, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = r.right - r.left - 375; lvC.iSubItem = 4; lvC.pszText = "File"; ListView_InsertColumn(hwndLV, 4, &lvC); ListView_SetImageList(hwndLV, tagImageList, LVSIL_SMALL); break; case WM_RESETHISTORY: SendMessage(hwndCombo, WM_SETHISTORY, 0, (LPARAM)varinfohist); break; case WM_SIZE: r.left = r.top = 0; r.right = LOWORD(lParam); r.bottom = HIWORD(lParam); MoveWindow(hwndLV, r.left, r.top+BUTTONHEIGHT + 4, r.right - r.left, r.bottom - r.top-BUTTONHEIGHT - 4, 1); MoveWindow(hwndBackground, r.left, r.top, r.right - r.left, BUTTONHEIGHT + 4, 1); lvC.mask = LVCF_WIDTH; lvC.cx = r.right - r.left - 375; ListView_SetColumn(hwndLV, 4, &lvC); break; case WM_DESTROY: hwndBrowse = 0; break; case WM_SETFOCUS: break; case WM_KILLFOCUS: break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }
static void RedrawSampleFont(void) { if (!IsInitialized) { return; } WndProperty* wp; wp = (WndProperty*)wf->FindByName(TEXT("prpFontName")); if(wp) { _tcsncpy(NewLogFont.lfFaceName,wp->GetDataField()->GetAsString(), LF_FACESIZE-1); } wp = (WndProperty*)wf->FindByName(TEXT("prpFontHeight")); if(wp) { NewLogFont.lfHeight = wp->GetDataField()->GetAsInteger(); } wp = (WndProperty*)wf->FindByName(TEXT("prpFontWeight")); if(wp) { NewLogFont.lfWeight= wp->GetDataField()->GetAsInteger(); } wp = (WndProperty*)wf->FindByName(TEXT("prpFontItalic")); if(wp) { if ( wp->GetDataField()->GetAsInteger() ) { NewLogFont.lfItalic=1; } else { NewLogFont.lfItalic=0; } } wp = (WndProperty*)wf->FindByName(TEXT("prpFontPitchAndFamily")); if (wp) { NewLogFont.lfPitchAndFamily=wp->GetDataField()->GetAsInteger(); } /* UNUSED //KT wp = (WndProperty*)wf->FindByName(TEXT("prpFontTrueType")); if(wp) { if ( wp->GetDataField()->GetAsBoolean() ) { wp = (WndProperty*)wf->FindByName(TEXT("prpFontRenderer")); if(wp) { if ( wp->GetDataField()->GetAsInteger() ) { NewLogFont.lfQuality = CLEARTYPE_COMPAT_QUALITY; } else { NewLogFont.lfQuality = ANTIALIASED_QUALITY; } } } else { NewLogFont.lfQuality = NONANTIALIASED_QUALITY; } } */ DeleteObject(NewFont); NewFont = CreateFontIndirect (&NewLogFont); if ( _tcscmp(OriginalFontRegKey, szRegistryFontMapWindowBoldFont) == 0 ) { wf->SetFont(NewFont); wf->SetTitleFont(NewFont); wf->SetVisible(false); wf->SetVisible(true); } wp = (WndProperty*)wf->FindByName(TEXT("prpFontSample")); if(wp) { if (GetObjectType(NewFont) == OBJ_FONT) { wp->SetFont(NewFont); wp->SetCaption(TEXT("<AbCdEfGh1234>")); wp->SetVisible(false); wp->SetVisible(true); wp->RefreshDisplay(); } else { wp->SetCaption(TEXT("Error Creating Font!")); wp->RefreshDisplay(); } } }
INT_PTR CALLBACK DlgProcContainerOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndTree = GetDlgItem(hwndDlg, IDC_SECTIONTREE); TContainerData *pContainer = (TContainerData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: { TVINSERTSTRUCT tvis = { 0 }; int nr_layouts = 0; const TSideBarLayout *sblayouts = CSideBar::getLayouts(nr_layouts); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); pContainer = (TContainerData*)lParam; pContainer->hWndOptions = hwndDlg; TranslateDialogDefault(hwndDlg); SetWindowText(hwndDlg, TranslateT("Container options")); TCHAR szNewTitle[128]; mir_sntprintf(szNewTitle, _T("%s"), !mir_tstrcmp(pContainer->szName, _T("default")) ? TranslateT("Default container") : pContainer->szName); SetDlgItemText(hwndDlg, IDC_HEADERBAR, szNewTitle); Utils::enableDlgControl(hwndDlg, IDC_O_HIDETITLE, !CSkin::m_frameSkins); CheckDlgButton(hwndDlg, IDC_CNTPRIVATE, pContainer->settings->fPrivate ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Tabs at the top")); SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Tabs at the bottom")); SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Switch bar on the left side")); SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Switch bar on the right side")); SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Globally on")); SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("On, if present")); SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Globally OFF")); SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("On, if present, always in bottom display")); SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("On, if present")); SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Don't show them")); for (int i = 0; i < nr_layouts; i++) SendDlgItemMessage(hwndDlg, IDC_SBARLAYOUT, CB_INSERTSTRING, -1, (LPARAM)TranslateTS(sblayouts[i].szName)); /* bits 24 - 31 of dwFlagsEx hold the side bar layout id */ SendDlgItemMessage(hwndDlg, IDC_SBARLAYOUT, CB_SETCURSEL, (WPARAM)((pContainer->settings->dwFlagsEx & 0xff000000) >> 24), 0); SendMessage(hwndDlg, DM_SC_INITDIALOG, 0, (LPARAM)pContainer->settings); SendDlgItemMessage(hwndDlg, IDC_TITLEFORMAT, EM_LIMITTEXT, TITLE_FORMATLEN - 1, 0); SetDlgItemText(hwndDlg, IDC_TITLEFORMAT, pContainer->settings->szTitleFormat); SetDlgItemText(hwndDlg, IDC_THEME, pContainer->szRelThemeFile); for (int i = 0; i < NR_O_PAGES; i++) { tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_TEXT | TVIF_PARAM; tvis.item.pszText = TranslateTS(o_pages[i].szTitle); tvis.item.lParam = i; HTREEITEM hItem = TreeView_InsertItem(hwndTree, &tvis); if (i == 0) SendMessage(hwndTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItem); for (int j = 0; j < NR_O_OPTIONSPERPAGE && o_pages[i].uIds[j] != 0; j++) Utils::showDlgControl(hwndDlg, o_pages[i].uIds[j], SW_HIDE); ShowPage(hwndDlg, i, FALSE); } SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)Skin_LoadIcon(SKINICON_EVENT_MESSAGE)); SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)Skin_LoadIcon(SKINICON_EVENT_MESSAGE, true)); ShowPage(hwndDlg, 0, TRUE); SetFocus(hwndTree); Utils::enableDlgControl(hwndDlg, IDC_APPLY, false); HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_DESC, WM_GETFONT, 0, 0); LOGFONT lf = { 0 }; GetObject(hFont, sizeof(lf), &lf); lf.lfHeight = (int)(lf.lfHeight * 1.2); hFont = CreateFontIndirect(&lf); SendDlgItemMessage(hwndDlg, IDC_TITLEBOX, WM_SETFONT, (WPARAM)hFont, TRUE); if (pContainer->isCloned && pContainer->hContactFrom != 0) { Utils::showDlgControl(hwndDlg, IDC_CNTPRIVATE, SW_HIDE); Utils::showDlgControl(hwndDlg, IDC_O_CNTPRIVATE, SW_HIDE); } return FALSE; } case WM_CTLCOLOREDIT: case WM_CTLCOLORSTATIC: { HWND hwndChild = (HWND)lParam; UINT id = GetDlgCtrlID(hwndChild); if (hwndChild == GetDlgItem(hwndDlg, IDC_TITLEBOX)) ::SetTextColor((HDC)wParam, RGB(60, 60, 150)); else if (hwndChild == GetDlgItem(hwndDlg, IDC_DESC)) ::SetTextColor((HDC)wParam, RGB(160, 50, 50)); if (id == IDC_TSLABEL_REOPENWARN) break; SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW)); return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); } case WM_NOTIFY: if (wParam == IDC_SECTIONTREE && ((LPNMHDR)lParam)->code == TVN_SELCHANGED) { NMTREEVIEW *pmtv = (NMTREEVIEW *)lParam; ShowPage(hwndDlg, pmtv->itemOld.lParam, 0); ShowPage(hwndDlg, pmtv->itemNew.lParam, 1); } break; case WM_HSCROLL: if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_TRANSPARENCY_ACTIVE) || (HWND)lParam == GetDlgItem(hwndDlg, IDC_TRANSPARENCY_INACTIVE)) Utils::enableDlgControl(hwndDlg, IDC_APPLY, true); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CNTPRIVATE: { if (IsDlgButtonChecked(hwndDlg, IDC_CNTPRIVATE)) { Utils::ReadPrivateContainerSettings(pContainer, true); pContainer->settings->fPrivate = true; } else { if (pContainer->settings != &PluginConfig.globalContainerSettings) { char szCname[40]; mir_snprintf(szCname, "%s%d_Blob", CNT_BASEKEYNAME, pContainer->iContainerIndex); pContainer->settings->fPrivate = false; db_set_blob(0, SRMSGMOD_T, szCname, pContainer->settings, sizeof(TContainerSettings)); mir_free(pContainer->settings); } pContainer->settings = &PluginConfig.globalContainerSettings; pContainer->settings->fPrivate = false; } SendMessage(hwndDlg, DM_SC_INITDIALOG, 0, (LPARAM)pContainer->settings); goto do_apply; } case IDC_TRANSPARENCY: { bool isTrans = IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENCY) != 0; Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_ACTIVE, isTrans); Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_INACTIVE, isTrans); goto do_apply; } case IDC_SECTIONTREE: case IDC_DESC: return 0; case IDC_SAVESIZEASGLOBAL: { WINDOWPLACEMENT wp = { 0 }; wp.length = sizeof(wp); if (GetWindowPlacement(pContainer->hwnd, &wp)) { db_set_dw(0, SRMSGMOD_T, "splitx", wp.rcNormalPosition.left); db_set_dw(0, SRMSGMOD_T, "splity", wp.rcNormalPosition.top); db_set_dw(0, SRMSGMOD_T, "splitwidth", wp.rcNormalPosition.right - wp.rcNormalPosition.left); db_set_dw(0, SRMSGMOD_T, "splitheight", wp.rcNormalPosition.bottom - wp.rcNormalPosition.top); } break; } case IDC_O_ENABLESOUNDS: SendMessage(hwndDlg, DM_SC_CONFIG, 0, 0); break; case IDC_TITLEFORMAT: if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return TRUE; goto do_apply; case IDC_SELECTTHEME: { const wchar_t *szFileName = GetThemeFileName(0); if (PathFileExists(szFileName)) { SetDlgItemText(hwndDlg, IDC_THEME, szFileName); goto do_apply; } break; } case IDC_O_HELP_TITLEFORMAT: Utils_OpenUrl("http://wiki.miranda-ng.org/index.php?title=Plugin:TabSRMM/en/Title_bar_formatting"); break; case IDOK: case IDC_APPLY: { SendMessage(hwndDlg, DM_SC_BUILDLIST, 0, (LPARAM)pContainer->settings); pContainer->settings->dwTransparency = MAKELONG((WORD)SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_ACTIVE, TBM_GETPOS, 0, 0), (WORD)SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_INACTIVE, TBM_GETPOS, 0, 0)); pContainer->settings->avatarMode = (WORD)SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_GETCURSEL, 0, 0); pContainer->settings->ownAvatarMode = (WORD)SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_GETCURSEL, 0, 0); GetDlgItemText(hwndDlg, IDC_TITLEFORMAT, pContainer->settings->szTitleFormat, TITLE_FORMATLEN); pContainer->settings->szTitleFormat[TITLE_FORMATLEN - 1] = 0; pContainer->szRelThemeFile[0] = pContainer->szAbsThemeFile[0] = 0; if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_THEME)) > 0) { wchar_t szFinalThemeFile[MAX_PATH], szFilename[MAX_PATH]; GetDlgItemText(hwndDlg, IDC_THEME, szFilename, _countof(szFilename)); szFilename[MAX_PATH - 1] = 0; PathToAbsoluteT(szFilename, szFinalThemeFile, M.getDataPath()); if (mir_tstrcmp(szFilename, pContainer->szRelThemeFile)) pContainer->fPrivateThemeChanged = TRUE; if (PathFileExists(szFinalThemeFile)) _tcsncpy_s(pContainer->szRelThemeFile, szFilename, _TRUNCATE); else pContainer->szRelThemeFile[0] = 0; } else { pContainer->szRelThemeFile[0] = 0; pContainer->fPrivateThemeChanged = TRUE; } Utils::SettingsToContainer(pContainer); if (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_CNTPRIVATE)) { ReloadGlobalContainerSettings(true); ::db_set_blob(0, SRMSGMOD_T, CNT_KEYNAME, &PluginConfig.globalContainerSettings, sizeof(TContainerSettings)); } else { char *szSetting = "CNTW_"; Utils::SaveContainerSettings(pContainer, szSetting); } SendMessage(pContainer->hwnd, DM_CONFIGURECONTAINER, 0, 0); BroadCastContainer(pContainer, DM_SETINFOPANEL, 0, 0); ShowWindow(pContainer->hwnd, SW_HIDE); { RECT rc; GetWindowRect(pContainer->hwnd, &rc); SetWindowPos(pContainer->hwnd, 0, rc.left, rc.top, (rc.right - rc.left) - 1, (rc.bottom - rc.top) - 1, SWP_NOZORDER | SWP_DRAWFRAME | SWP_FRAMECHANGED); SetWindowPos(pContainer->hwnd, 0, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), SWP_NOZORDER | SWP_DRAWFRAME | SWP_SHOWWINDOW); } if (LOWORD(wParam) == IDOK) DestroyWindow(hwndDlg); else Utils::enableDlgControl(hwndDlg, IDC_APPLY, false); break; } case IDCANCEL: DestroyWindow(hwndDlg); return TRUE; default: do_apply : Utils::enableDlgControl(hwndDlg, IDC_APPLY, true); break; } break; case DM_SC_INITDIALOG: { TContainerSettings* cs = (TContainerSettings *)lParam; DWORD dwFlags = cs->dwFlags; DWORD dwTransparency = cs->dwTransparency; DWORD dwFlagsEx = cs->dwFlagsEx; BOOL fAllowTrans = FALSE; if (PluginConfig.m_WinVerMajor >= 6) fAllowTrans = TRUE; else fAllowTrans = (!CSkin::m_skinEnabled); MY_CheckDlgButton(hwndDlg, IDC_O_HIDETITLE, dwFlags & CNT_NOTITLE); MY_CheckDlgButton(hwndDlg, IDC_O_DONTREPORT, dwFlags & CNT_DONTREPORT); MY_CheckDlgButton(hwndDlg, IDC_O_NOTABS, dwFlags & CNT_HIDETABS); MY_CheckDlgButton(hwndDlg, IDC_O_STICKY, dwFlags & CNT_STICKY); MY_CheckDlgButton(hwndDlg, IDC_O_FLASHNEVER, dwFlags & CNT_NOFLASH); MY_CheckDlgButton(hwndDlg, IDC_O_FLASHALWAYS, dwFlags & CNT_FLASHALWAYS); MY_CheckDlgButton(hwndDlg, IDC_O_FLASHDEFAULT, !((dwFlags & CNT_NOFLASH) || (dwFlags & CNT_FLASHALWAYS))); MY_CheckDlgButton(hwndDlg, IDC_TRANSPARENCY, dwFlags & CNT_TRANSPARENCY); MY_CheckDlgButton(hwndDlg, IDC_DONTREPORTUNFOCUSED2, dwFlags & CNT_DONTREPORTUNFOCUSED); MY_CheckDlgButton(hwndDlg, IDC_DONTREPORTFOCUSED2, dwFlags & CNT_DONTREPORTFOCUSED); MY_CheckDlgButton(hwndDlg, IDC_ALWAYSPOPUPSINACTIVE, dwFlags & CNT_ALWAYSREPORTINACTIVE); MY_CheckDlgButton(hwndDlg, IDC_CNTNOSTATUSBAR, dwFlags & CNT_NOSTATUSBAR); MY_CheckDlgButton(hwndDlg, IDC_HIDEMENUBAR, dwFlags & CNT_NOMENUBAR); MY_CheckDlgButton(hwndDlg, IDC_HIDETOOLBAR, dwFlags & CNT_HIDETOOLBAR); MY_CheckDlgButton(hwndDlg, IDC_BOTTOMTOOLBAR, dwFlags & CNT_BOTTOMTOOLBAR); MY_CheckDlgButton(hwndDlg, IDC_UIDSTATUSBAR, dwFlags & CNT_UINSTATUSBAR); MY_CheckDlgButton(hwndDlg, IDC_VERTICALMAX, dwFlags & CNT_VERTICALMAX); MY_CheckDlgButton(hwndDlg, IDC_AUTOSPLITTER, dwFlags & CNT_AUTOSPLITTER); MY_CheckDlgButton(hwndDlg, IDC_AVATARSONTASKBAR, dwFlags & CNT_AVATARSONTASKBAR); MY_CheckDlgButton(hwndDlg, IDC_INFOPANEL, dwFlags & CNT_INFOPANEL); MY_CheckDlgButton(hwndDlg, IDC_USEGLOBALSIZE, dwFlags & CNT_GLOBALSIZE); MY_CheckDlgButton(hwndDlg, IDC_FLASHICON, dwFlagsEx & TCF_FLASHICON); MY_CheckDlgButton(hwndDlg, IDC_FLASHLABEL, dwFlagsEx & TCF_FLASHLABEL); MY_CheckDlgButton(hwndDlg, IDC_CLOSEBUTTONONTABS, dwFlagsEx & TCF_CLOSEBUTTON); MY_CheckDlgButton(hwndDlg, IDC_SINGLEROWTAB, dwFlagsEx & TCF_SINGLEROWTABCONTROL); MY_CheckDlgButton(hwndDlg, IDC_BUTTONTABS, dwFlagsEx & TCF_FLAT); MY_CheckDlgButton(hwndDlg, IDC_O_ENABLESOUNDS, !(dwFlags & CNT_NOSOUND)); MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSMINIMIZED, dwFlagsEx & CNT_EX_SOUNDS_MINIMIZED); MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSUNFOCUSED, dwFlagsEx & CNT_EX_SOUNDS_UNFOCUSED); MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSINACTIVE, dwFlagsEx & CNT_EX_SOUNDS_INACTIVETABS); MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSFOCUSED, dwFlagsEx & CNT_EX_SOUNDS_FOCUSED); SendMessage(hwndDlg, DM_SC_CONFIG, 0, 0); if (!(dwFlagsEx & (TCF_SBARLEFT | TCF_SBARRIGHT))) SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_SETCURSEL, dwFlags & CNT_TABSBOTTOM ? 1 : 0, 0); else SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_SETCURSEL, dwFlagsEx & TCF_SBARLEFT ? 2 : 3, 0); if (LOBYTE(LOWORD(GetVersion())) >= 5 && fAllowTrans) CheckDlgButton(hwndDlg, IDC_TRANSPARENCY, dwFlags & CNT_TRANSPARENCY ? BST_CHECKED : BST_UNCHECKED); else CheckDlgButton(hwndDlg, IDC_TRANSPARENCY, BST_UNCHECKED); Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY, PluginConfig.m_WinVerMajor >= 5 && fAllowTrans); bool isTrans = IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENCY) != 0; Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_ACTIVE, isTrans); Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_INACTIVE, isTrans); SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_ACTIVE, TBM_SETRANGE, 0, (LPARAM)MAKELONG(50, 255)); SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_INACTIVE, TBM_SETRANGE, 0, (LPARAM)MAKELONG(50, 255)); SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_ACTIVE, TBM_SETPOS, TRUE, (LPARAM)LOWORD(dwTransparency)); SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_INACTIVE, TBM_SETPOS, TRUE, (LPARAM)HIWORD(dwTransparency)); Utils::enableDlgControl(hwndDlg, IDC_O_DONTREPORT, !nen_options.bWindowCheck); Utils::enableDlgControl(hwndDlg, IDC_DONTREPORTUNFOCUSED2, !nen_options.bWindowCheck); Utils::enableDlgControl(hwndDlg, IDC_DONTREPORTFOCUSED2, !nen_options.bWindowCheck); Utils::enableDlgControl(hwndDlg, IDC_ALWAYSPOPUPSINACTIVE, !nen_options.bWindowCheck); SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_SETCURSEL, (WPARAM)cs->avatarMode, 0); SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_SETCURSEL, (WPARAM)cs->ownAvatarMode, 0); Utils::showDlgControl(hwndDlg, IDC_O_EXPLAINGLOBALNOTIFY, nen_options.bWindowCheck ? SW_SHOW : SW_HIDE); SendDlgItemMessage(hwndDlg, IDC_AUTOCLOSETABSPIN, UDM_SETRANGE, 0, MAKELONG(1000, 0)); SendDlgItemMessage(hwndDlg, IDC_AUTOCLOSETABSPIN, UDM_SETPOS, 0, (LPARAM)cs->autoCloseSeconds); break; } case DM_SC_CONFIG: { bool bEnable = IsDlgButtonChecked(hwndDlg, IDC_O_ENABLESOUNDS) != 0; Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSINACTIVE, bEnable); Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSUNFOCUSED, bEnable); Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSMINIMIZED, bEnable); Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSFOCUSED, bEnable); return 0; } case DM_SC_BUILDLIST: { DWORD dwNewFlags = 0, dwNewFlagsEx = 0; TContainerSettings* cs = (TContainerSettings *)lParam; dwNewFlags = (IsDlgButtonChecked(hwndDlg, IDC_O_HIDETITLE) ? CNT_NOTITLE : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_DONTREPORT) ? CNT_DONTREPORT : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_NOTABS) ? CNT_HIDETABS : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_STICKY) ? CNT_STICKY : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_FLASHALWAYS) ? CNT_FLASHALWAYS : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_FLASHNEVER) ? CNT_NOFLASH : 0) | (IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENCY) ? CNT_TRANSPARENCY : 0) | (IsDlgButtonChecked(hwndDlg, IDC_DONTREPORTUNFOCUSED2) ? CNT_DONTREPORTUNFOCUSED : 0) | (IsDlgButtonChecked(hwndDlg, IDC_DONTREPORTFOCUSED2) ? CNT_DONTREPORTFOCUSED : 0) | (IsDlgButtonChecked(hwndDlg, IDC_ALWAYSPOPUPSINACTIVE) ? CNT_ALWAYSREPORTINACTIVE : 0) | (IsDlgButtonChecked(hwndDlg, IDC_CNTNOSTATUSBAR) ? CNT_NOSTATUSBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_HIDEMENUBAR) ? CNT_NOMENUBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_HIDETOOLBAR) ? CNT_HIDETOOLBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_BOTTOMTOOLBAR) ? CNT_BOTTOMTOOLBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_UIDSTATUSBAR) ? CNT_UINSTATUSBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_USEGLOBALSIZE) ? CNT_GLOBALSIZE : 0) | (IsDlgButtonChecked(hwndDlg, IDC_INFOPANEL) ? CNT_INFOPANEL : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_ENABLESOUNDS) ? 0 : CNT_NOSOUND) | (IsDlgButtonChecked(hwndDlg, IDC_AVATARSONTASKBAR) ? CNT_AVATARSONTASKBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_VERTICALMAX) ? CNT_VERTICALMAX : 0) | (IsDlgButtonChecked(hwndDlg, IDC_AUTOSPLITTER) ? CNT_AUTOSPLITTER : 0) | (CNT_NEWCONTAINERFLAGS); LRESULT iTabMode = SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_GETCURSEL, 0, 0); LRESULT iTabLayout = SendDlgItemMessage(hwndDlg, IDC_SBARLAYOUT, CB_GETCURSEL, 0, 0); dwNewFlagsEx = 0; if (iTabMode < 2) dwNewFlags = ((iTabMode == 1) ? (dwNewFlags | CNT_TABSBOTTOM) : (dwNewFlags & ~CNT_TABSBOTTOM)); else { dwNewFlags &= ~CNT_TABSBOTTOM; dwNewFlagsEx = iTabMode == 2 ? TCF_SBARLEFT : TCF_SBARRIGHT; } dwNewFlagsEx |= ((IsDlgButtonChecked(hwndDlg, IDC_FLASHICON) ? TCF_FLASHICON : 0) | (IsDlgButtonChecked(hwndDlg, IDC_FLASHLABEL) ? TCF_FLASHLABEL : 0) | (IsDlgButtonChecked(hwndDlg, IDC_BUTTONTABS) ? TCF_FLAT : 0) | (IsDlgButtonChecked(hwndDlg, IDC_CLOSEBUTTONONTABS) ? TCF_CLOSEBUTTON : 0) | (IsDlgButtonChecked(hwndDlg, IDC_SINGLEROWTAB) ? TCF_SINGLEROWTABCONTROL : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSMINIMIZED) ? CNT_EX_SOUNDS_MINIMIZED : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSUNFOCUSED) ? CNT_EX_SOUNDS_UNFOCUSED : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSFOCUSED) ? CNT_EX_SOUNDS_FOCUSED : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSINACTIVE) ? CNT_EX_SOUNDS_INACTIVETABS : 0) ); /* bits 24 - 31 of dwFlagsEx hold the sidebar layout id */ dwNewFlagsEx |= ((int)((iTabLayout << 24) & 0xff000000)); if (IsDlgButtonChecked(hwndDlg, IDC_O_FLASHDEFAULT)) dwNewFlags &= ~(CNT_FLASHALWAYS | CNT_NOFLASH); cs->dwFlags = dwNewFlags; cs->dwFlagsEx = dwNewFlagsEx; cs->autoCloseSeconds = (WORD)SendDlgItemMessage(hwndDlg, IDC_AUTOCLOSETABSPIN, UDM_GETPOS, 0, 0); break; } case WM_DESTROY: { pContainer->hWndOptions = 0; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_TITLEBOX, WM_GETFONT, 0, 0); DeleteObject(hFont); break; } } return FALSE; }
static LRESULT CALLBACK PlayListWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HWND wdg; POINT cursor; playlist_t *pl = playlist; switch (iMsg) { case WM_CREATE: { RECT r; LOGFONT lf; memset(&lf,0, sizeof(LOGFONT)); strcpy(lf.lfFaceName,"MS Shell Dlg"); lf.lfHeight = -10; lf.lfWeight = FW_NORMAL; HFONT hFont=CreateFontIndirect(&lf); wdg = CreateWindow("button", BottonPlayAll, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 4, 10, 80, 22, hwnd, (HMENU) ID_PLAY, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); SendMessage(wdg, WM_SETFONT, (WPARAM)hFont, 0); wdg = CreateWindow ("button", BottonUp, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 4, 35, 80, 22, hwnd, (HMENU) ID_UP, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); SendMessage(wdg, WM_SETFONT, (WPARAM)hFont, 0); wdg = CreateWindow ("button",BottonDown, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 4, 60, 80, 22, hwnd, (HMENU) ID_DOWN, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); SendMessage(wdg, WM_SETFONT, (WPARAM)hFont, 0); wdg = CreateWindow ("button", BottonRemove, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 4, 85, 80, 22, hwnd, (HMENU) ID_REMOVE, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); SendMessage(wdg, WM_SETFONT, (WPARAM)hFont, 0); wdg = CreateWindow ("button", BottonAdd, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 4, 110, 80, 22, hwnd, (HMENU) ID_ADDFILE, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); SendMessage(wdg, WM_SETFONT, (WPARAM)hFont, 0); wdg = CreateWindow ("button", BottonSave, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 4, 135, 80, 22, hwnd, (HMENU) ID_PLAYLISTSAVE, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); SendMessage(wdg, WM_SETFONT, (WPARAM)hFont, 0); wdg = CreateWindow ("button", BottonClose, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 4, 185, 80, 22, hwnd, (HMENU) ID_CLOSE, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); SendMessage(wdg, WM_SETFONT, (WPARAM)hFont, 0); GetClientRect(hwnd, &r); wdg = CreateWindowEx(WS_EX_CLIENTEDGE, "SysListView32", "tracklist", WS_CHILD | WS_VISIBLE | LVS_SINGLESEL | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER /*| LVS_NOCOLUMNHEADER*/, 90, 7, r.right-90, r.bottom-7, hwnd, (HMENU) ID_TRACKLIST, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); SendMessage(wdg, WM_SETFONT, (WPARAM)hFont, 0); wdgProc = SetWindowLong(wdg, GWL_WNDPROC, (LONG)ListProc); LV_COLUMNA lvc, lvc1, lvc2; ZeroMemory(&lvc, sizeof(LV_COLUMNA)); ZeroMemory(&lvc1, sizeof(LV_COLUMNA)); ZeroMemory(&lvc2, sizeof(LV_COLUMNA)); lvc.mask = LVCF_WIDTH; lvc.cx = 24; lvc1.mask = LVCF_WIDTH; lvc1.cx = 700; lvc2.mask = LVCF_WIDTH; lvc2.cx = 500; SendMessage(wdg, LVM_INSERTCOLUMN,0, &lvc); SendMessage(wdg, LVM_INSERTCOLUMN,1, &lvc1); SendMessage(wdg, LVM_INSERTCOLUMN,2, &lvc2); SendMessage(wdg, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); break; } case WM_CONTEXTMENU: { GetCursorPos(&cursor); SetForegroundWindow(hwnd); TrackPopupMenu(playlistmenu, 0, cursor.x, cursor.y, 0, hwnd, NULL); break; } case WM_NOTIFY: { if(wParam == ID_TRACKLIST) { NMHDR *nmhdr = (NMHDR *)lParam; if(nmhdr && nmhdr->code == NM_DBLCLK) { int selected = SendDlgItemMessage(hwnd, ID_TRACKLIST, LVM_GETSELECTIONMARK, 0, 0); if(0 <= selected) { pl->current = selected; playtree_update_play(mpctx, pl->current); return 0; } } else if(nmhdr && nmhdr->code == NM_CLICK) button_down = FALSE; } break; } case WM_LBUTTONDOWN: PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(LOWORD(lParam), HIWORD(lParam))); break; case WM_NCLBUTTONUP: case WM_LBUTTONUP: button_down = FALSE; break; case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE: ShowWindow(hwnd, SW_HIDE); break; } break; case WM_COMMAND: { int selected = 0; int i = SendDlgItemMessage(hwnd, ID_TRACKLIST, LVM_GETSELECTIONMARK, 0, 0); if(0 <= i) selected = i + 1; switch (LOWORD(wParam)) { case ID_CLOSE: if(SetLayeredWinAttributes) { if(transparent) { transparent = 0; SetLayeredWinAttributes(hPlaylistWnd, 0, 255, 2); } else { transparent = 1; SetLayeredWinAttributes(hPlaylistWnd, 0, controlbar_alpha, 2); } } break; case ID_PLAY: if(selected) { pl->current = selected - 1; playtree_update_play(mpctx, pl->current); } else playtree_update_play(mpctx, 0); return 0; case ID_UP: if(selected) pl->moveup_track(pl, selected); selected--; up_list_item(hwnd, selected); need_update_playtree = 1; return 0; case ID_DOWN: if(selected) pl->movedown_track(pl, selected); down_list_item(hwnd, selected-1); selected++; need_update_playtree = 1; return 0; case ID_REMOVE: if(selected) pl->remove_track(pl, selected); delete_list_item(hwnd, selected-1); need_update_playtree = 1; return 0; case ID_ADDFILE: display_openfilewindow(1); break; case ID_CLEAR: if(!playlist->trackcount) return 0; playlist->clear_playlist(playlist); SendDlgItemMessage(hwnd, ID_TRACKLIST, LVM_DELETEALLITEMS, 0, 0); need_update_playtree = 1; return 0; case ID_PLAYLISTLOAD: display_loadplaylistwindow(); break; case ID_PLAYLISTSAVE: { /* no point saving an empty playlist */ display_saveplaylistwindow(); break; } } updatetracklist(hwnd); if(selected < 1) selected = 1; else if(selected>pl->trackcount) selected = pl->trackcount; SendDlgItemMessage(hwnd, ID_TRACKLIST, LVM_SETSELECTIONMARK, 0, selected - 1); return 0; } case WM_DROPFILES: { DWORD t; char file[MAX_PATH]; wchar_t tmpw[MAX_PATH], tmpshot[MAX_PATH]; int filecount = DragQueryFile((HDROP) wParam, -1, file, MAX_PATH); int i; for (i=0; i<filecount; i++) { DragQueryFile((HDROP) wParam, i, file, MAX_PATH); t = GetFileAttributes(file); if (t & 0x10) { if(t == 0xFFFFFFFF) { DragQueryFileW((HDROP)wParam, i, tmpw, MAX_PATH); GetShortPathNameW(tmpw,tmpshot,MAX_PATH); wcstombs(file,tmpshot,MAX_PATH); } add_directory_to_playlist(file); } else { if(t == 0xFFFFFFFF) { DragQueryFileW((HDROP)wParam, i, tmpw, MAX_PATH); GetShortPathNameW(tmpw,tmpshot,MAX_PATH); wcstombs(file,tmpshot,MAX_PATH); } pl->add_track(pl, file, NULL, NULL, 0); playtree_add_file(mpctx->playtree, file); } } DragFinish((HDROP) wParam); updatetracklist(hwnd); break; } case WM_SIZING: { LPRECT rc = (LPRECT)lParam; if(rc->right - rc->left < WinWidth-100) rc->right = rc->left + WinWidth-100; if(rc->bottom - rc->top < WinHeight-30) rc->bottom = rc->top + WinHeight-30; break; } case WM_SIZE: { RECT r; GetClientRect(hwnd, &r); MoveWindow(GetDlgItem(hwnd, ID_TRACKLIST), 90, 7, r.right-90, r.bottom-7, TRUE); break; } case WM_SYSCOMMAND: { if (wParam == SC_MINIMIZE) { ShowWindow(hwnd, SW_HIDE); return 0; } break; } case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, iMsg, wParam, lParam); }
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static uint32_t lanLastPing = 0; static HFONT _hFont = 0; switch (message) { case WM_CREATE: { HFONT hFont = 0; NONCLIENTMETRICS ncm = { sizeof(ncm) }; if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0)) { hFont = CreateFontIndirect(&ncm.lfMessageFont); _hFont = hFont; } if (!hFont) hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); RECT rcClient; GetClientRect(hWnd, &rcClient); g_hWndListViewServers = CreateWindow(WC_LISTVIEW, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_OWNERDATA, 1, 21, rcClient.right - UI_PLAYERLIST_WIDTH - 4, rcClient.bottom - UI_SERVERINFO_HEIGHT - 21 - 2, hWnd, nullptr, g_hInst, nullptr); if (g_hWndListViewServers) { SetWindowTheme(g_hWndListViewServers, L"Explorer", nullptr); ListView_SetExtendedListViewStyle(g_hWndListViewServers, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER); LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = 30; ListView_InsertColumn(g_hWndListViewServers, 0, &lvc); lvc.mask = LVCF_WIDTH | LVCF_TEXT; lvc.cx = 240; lvc.pszText = LoadStr(L"Server Name", IDS_SERVERNAME); ListView_InsertColumn(g_hWndListViewServers, 1, &lvc); lvc.cx = 60; lvc.pszText = LoadStr(L"Ping", IDS_PING); ListView_InsertColumn(g_hWndListViewServers, 2, &lvc); lvc.cx = 80; lvc.pszText = LoadStr(L"Players", IDS_PLAYERS); ListView_InsertColumn(g_hWndListViewServers, 3, &lvc); lvc.cx = 70; lvc.pszText = LoadStr(L"Version", IDS_VERSION); ListView_InsertColumn(g_hWndListViewServers, 4, &lvc); lvc.cx = 120; lvc.pszText = LoadStr(L"Gamemode", IDS_GAMEMODE); ListView_InsertColumn(g_hWndListViewServers, 5, &lvc); lvc.cx = 100; lvc.pszText = LoadStr(L"Map Name", IDS_MAPNAME); ListView_InsertColumn(g_hWndListViewServers, 6, &lvc); } g_hWndListViewHistory = CreateWindow(WC_LISTVIEW, nullptr, WS_CHILD | WS_CLIPSIBLINGS | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_OWNERDATA, 1, 21, rcClient.right - UI_PLAYERLIST_WIDTH - 4, rcClient.bottom - UI_SERVERINFO_HEIGHT - 21 - 2, hWnd, nullptr, g_hInst, nullptr); if (g_hWndListViewHistory) { SetWindowTheme(g_hWndListViewHistory, L"Explorer", nullptr); ListView_SetExtendedListViewStyle(g_hWndListViewHistory, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER); LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = 30; ListView_InsertColumn(g_hWndListViewHistory, 0, &lvc); lvc.mask = LVCF_WIDTH | LVCF_TEXT; lvc.cx = 220; lvc.pszText = LoadStr(L"Server Name", IDS_SERVERNAME); ListView_InsertColumn(g_hWndListViewHistory, 1, &lvc); lvc.cx = 60; lvc.pszText = LoadStr(L"Ping", IDS_PING); ListView_InsertColumn(g_hWndListViewHistory, 2, &lvc); lvc.cx = 80; lvc.pszText = LoadStr(L"Players", IDS_PLAYERS); ListView_InsertColumn(g_hWndListViewHistory, 3, &lvc); lvc.cx = 70; lvc.pszText = LoadStr(L"Version", IDS_VERSION); ListView_InsertColumn(g_hWndListViewHistory, 4, &lvc); lvc.cx = 100; lvc.pszText = LoadStr(L"Gamemode", IDS_GAMEMODE); ListView_InsertColumn(g_hWndListViewHistory, 5, &lvc); lvc.cx = 160; lvc.pszText = LoadStr(L"Last Played", IDS_LASTPLAYED); ListView_InsertColumn(g_hWndListViewHistory, 6, &lvc); } g_hWndTab = CreateWindow(WC_TABCONTROL, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, 0, 0, rcClient.right - UI_PLAYERLIST_WIDTH, rcClient.bottom - UI_SERVERINFO_HEIGHT, hWnd, nullptr, g_hInst, nullptr); if (g_hWndTab) { SetWindowFont(g_hWndTab, hFont, FALSE); HIMAGELIST hTabIml = ImageList_Create(16, 16, ILC_COLOR32, 0, 0); if (hTabIml) { for (int i = IDI_FAVORITE; i <= IDI_HISTORY; ++i) ImageList_AddIcon(hTabIml, LoadIcon(g_hInst, MAKEINTRESOURCE(i))); TabCtrl_SetImageList(g_hWndTab, hTabIml); } TCITEM tie; tie.mask = TCIF_TEXT | TCIF_IMAGE; tie.iImage = 0; tie.pszText = LoadStr(L"Favorites", IDS_FAVORITES); TabCtrl_InsertItem(g_hWndTab, 0, &tie); tie.iImage = 1; tie.pszText = LoadStr(L"Internet", IDS_INTERNET); TabCtrl_InsertItem(g_hWndTab, 1, &tie); tie.iImage = 1; tie.pszText = LoadStr(L"Official", IDS_OFFICIAL); TabCtrl_InsertItem(g_hWndTab, 2, &tie); tie.iImage = 2; tie.pszText = LoadStr(L"Lan", IDS_LAN); TabCtrl_InsertItem(g_hWndTab, 3, &tie); tie.iImage = 3; tie.pszText = LoadStr(L"History", IDS_HISTORY); TabCtrl_InsertItem(g_hWndTab, 4, &tie); } g_hWndListViewPlayers = CreateWindowEx(0, WC_LISTVIEW, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_SINGLESEL | LVS_OWNERDATA, rcClient.right - UI_PLAYERLIST_WIDTH + 1, 18, UI_PLAYERLIST_WIDTH - 2, rcClient.bottom - UI_SERVERINFO_HEIGHT - 18 - 2, hWnd, nullptr, g_hInst, nullptr); if (g_hWndListViewPlayers) { SetWindowTheme(g_hWndListViewPlayers, L"Explorer", nullptr); ListView_SetExtendedListViewStyle(g_hWndListViewPlayers, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER); LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = UI_PLAYERLIST_WIDTH - 2; ListView_InsertColumn(g_hWndListViewPlayers, 0, &lvc); } g_hWndGroupBox1 = CreateWindow(WC_BUTTON, LoadStr(L"Players", IDS_PLAYERSLIST), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_GROUPBOX, rcClient.right - UI_PLAYERLIST_WIDTH, 0, UI_PLAYERLIST_WIDTH, rcClient.bottom - UI_SERVERINFO_HEIGHT, hWnd, nullptr, g_hInst, nullptr); if (g_hWndGroupBox1) { SetWindowFont(g_hWndGroupBox1, hFont, FALSE); } g_hWndGroupBox2 = CreateWindow(WC_BUTTON, LoadStr(L"Server Info", IDS_SERVERINFO), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_GROUPBOX, 0, rcClient.bottom - UI_SERVERINFO_HEIGHT, rcClient.right, 118, hWnd, nullptr, g_hInst, nullptr); if (g_hWndGroupBox2) { SetWindowFont(g_hWndGroupBox2, hFont, FALSE); int y = 18; #define LINE_GAP 20 HWND hStatic = CreateWindow(WC_STATIC, LoadStr(L"Server Name:", IDS_SERVERNAME_), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 10, y, 100, 16, g_hWndGroupBox2, nullptr, g_hInst, nullptr); if (hStatic) SetWindowFont(hStatic, hFont, FALSE); HWND hEdit = CreateWindow(WC_EDIT, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_READONLY, 112, y, 300, 16, g_hWndGroupBox2, (HMENU)1001, g_hInst, nullptr); if (hEdit) SetWindowFont(hEdit, hFont, FALSE); y += LINE_GAP; hStatic = CreateWindow(WC_STATIC, LoadStr(L"Server IP:", IDS_SERVERIP), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 10, y, 100, 16, g_hWndGroupBox2, nullptr, g_hInst, nullptr); if (hStatic) SetWindowFont(hStatic, hFont, FALSE); hEdit = CreateWindow(WC_EDIT, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_READONLY, 112, y, 300, 16, g_hWndGroupBox2, (HMENU)1002, g_hInst, nullptr); if (hEdit) SetWindowFont(hEdit, hFont, FALSE); y += LINE_GAP; hStatic = CreateWindow(WC_STATIC, LoadStr(L"Server Players:", IDS_SERVERPLAYERS), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 10, y, 100, 16, g_hWndGroupBox2, nullptr, g_hInst, nullptr); if (hStatic) SetWindowFont(hStatic, hFont, FALSE); hEdit = CreateWindow(WC_EDIT, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_READONLY, 112, y, 300, 16, g_hWndGroupBox2, (HMENU)1003, g_hInst, nullptr); if (hEdit) SetWindowFont(hEdit, hFont, FALSE); y += LINE_GAP; hStatic = CreateWindow(WC_STATIC, LoadStr(L"Server Ping:", IDS_SERVERPING), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 10, y, 100, 16, g_hWndGroupBox2, nullptr, g_hInst, nullptr); if (hStatic) SetWindowFont(hStatic, hFont, FALSE); hEdit = CreateWindow(WC_EDIT, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_READONLY, 112, y, 300, 16, g_hWndGroupBox2, (HMENU)1004, g_hInst, nullptr); if (hEdit) SetWindowFont(hEdit, hFont, FALSE); y += LINE_GAP; hStatic = CreateWindow(WC_STATIC, LoadStr(L"Server Gamemode:", IDS_SERVERGAMEMODE), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 10, y, 100, 16, g_hWndGroupBox2, nullptr, g_hInst, nullptr); if (hStatic) SetWindowFont(hStatic, hFont, FALSE); hEdit = CreateWindow(WC_EDIT, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_READONLY, 112, y, 300, 16, g_hWndGroupBox2, (HMENU)1005, g_hInst, nullptr); if (hEdit) SetWindowFont(hEdit, hFont, FALSE); } g_hWndStatusBar = CreateWindow(STATUSCLASSNAME, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0, hWnd, nullptr, g_hInst, nullptr); do { g_UDPSocket = socket(AF_INET, SOCK_DGRAM, 0); if (g_UDPSocket == INVALID_SOCKET) break; uint32_t timeout = 2000; setsockopt(g_UDPSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); struct sockaddr_in bindaddr = { AF_INET }; if (bind(g_UDPSocket, (sockaddr *)&bindaddr, 16) != NO_ERROR) { closesocket(g_UDPSocket); break; } if (WSAAsyncSelect(g_UDPSocket, hWnd, WM_SOCKET, FD_READ) == SOCKET_ERROR) { closesocket(g_UDPSocket); break; } return 0; } while (0); } break; case WM_COMMAND: { int wmId = LOWORD(wParam); switch (wmId) { case IDM_TOOLS_SETTINGS: ShowSettings(); break; case IDM_ABOUT: DialogBox(g_hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_NOTIFY: { switch (((LPNMHDR)lParam)->code) { case TCN_SELCHANGE: { g_currentTab = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom); switch (g_currentTab) { case 0: // Favorites case 1: // Internet case 2: // Official case 3: // Lan ListView_DeleteAllItems(g_hWndListViewServers); ListView_DeleteAllItems(g_hWndListViewPlayers); g_serversList.clear(); ShowWindow(g_hWndListViewServers, SW_SHOW); ShowWindow(g_hWndListViewHistory, SW_HIDE); UpdateWindow(g_hWndListViewServers); if (g_currentTab == 1 || g_currentTab == 2) { HWND hDialog = CreateDialog(g_hInst, MAKEINTRESOURCEW(IDD_LOADING), hWnd, nullptr); SetWindowPos(hDialog, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); UpdateWindow(hDialog); if (g_serversMasterList) { delete g_serversMasterList; g_serversMasterList = nullptr; } std::string data; data.reserve(2048); const char *url; if (g_currentTab == 1) url = (g_browserSettings.masterlistURL + "/servers").c_str(); else url = (g_browserSettings.masterlistURL + "/official").c_str(); CURLcode curlRet = CurlRequset(url, data, "VCMP/0.4"); if (curlRet == CURLE_OK) { serverMasterList serversList; if (ParseJson(data.data(), serversList)) { for (auto it = serversList.begin(); it != serversList.end(); ++it) { SendQuery(it->address, 'i'); it->lastPing = GetTickCount(); } g_serversMasterList = new serverMasterList(serversList); } else { MessageBox(hWnd, LoadStr(L"Can't parse master list data.", IDS_MASTERLISTDATA), LoadStr(L"Error", IDS_ERROR), MB_ICONWARNING); } } else { wchar_t message[512]; swprintf_s(message, LoadStr(L"Can't get information from master list.\n%hs", IDS_MASTERLISTFAILED), curl_easy_strerror(curlRet)); MessageBox(hWnd, message, LoadStr(L"Error", IDS_ERROR), MB_ICONWARNING); } DestroyWindow(hDialog); } else if (g_currentTab == 3) { BOOL broadcast = TRUE; setsockopt(g_UDPSocket, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof(broadcast)); for (uint16_t port = 8000; port <= 8200; ++port) { serverAddress address = { INADDR_BROADCAST, port }; SendQuery(address, 'i'); } broadcast = FALSE; setsockopt(g_UDPSocket, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof(broadcast)); lanLastPing = GetTickCount(); } break; case 4: // History ShowWindow(g_hWndListViewHistory, SW_SHOW); ShowWindow(g_hWndListViewServers, SW_HIDE); break; } } break; case LVN_GETDISPINFO: { LPNMLVDISPINFOW di = (LPNMLVDISPINFOW)lParam; if (di->hdr.hwndFrom == g_hWndListViewServers) { size_t i = di->item.iItem; if (g_serversList.size() > i) { if (di->item.iSubItem == 0 && di->item.mask & LVIF_IMAGE) di->item.iImage = 0; if (di->item.mask & LVIF_TEXT) { switch (di->item.iSubItem) { case 0: // Icon break; case 1: // Server Name if (di->item.cchTextMax > 0 && di->item.pszText) { MultiByteToWideChar(CP_ACP, 0, g_serversList[i].info.serverName.c_str(), -1, di->item.pszText, di->item.cchTextMax); } break; case 2: // Ping { uint32_t ping = g_serversList[i].lastRecv - g_serversList[i].lastPing[1]; _itow_s(ping, di->item.pszText, di->item.cchTextMax, 10); } break; case 3: // Players swprintf_s(di->item.pszText, di->item.cchTextMax, L"%hu/%hu", g_serversList[i].info.players, g_serversList[i].info.maxPlayers); break; case 4: // Version { MultiByteToWideChar(CP_ACP, 0, g_serversList[i].info.versionName, -1, di->item.pszText, di->item.cchTextMax); } break; case 5: // Gamemode { MultiByteToWideChar(CP_ACP, 0, g_serversList[i].info.gameMode.c_str(), -1, di->item.pszText, di->item.cchTextMax); } break; case 6: // Map name { MultiByteToWideChar(CP_ACP, 0, g_serversList[i].info.mapName.c_str(), -1, di->item.pszText, di->item.cchTextMax); } break; } } } } else if (di->hdr.hwndFrom == g_hWndListViewHistory) // FIXME { } else if (di->hdr.hwndFrom == g_hWndListViewPlayers) { size_t i = ListView_GetSelectionMark(g_hWndListViewServers); if (g_serversList.size() > i) { serverPlayers &players = g_serversList[i].players; size_t j = di->item.iItem; if (players.size() > j) { if (di->item.mask & LVIF_TEXT) { MultiByteToWideChar(CP_ACP, 0, players[j].name, -1, di->item.pszText, di->item.cchTextMax); } } } } } break; case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW nmcd = (LPNMLVCUSTOMDRAW)lParam; if (nmcd->nmcd.hdr.hwndFrom == g_hWndListViewServers) { switch (nmcd->nmcd.dwDrawStage) { case CDDS_PREPAINT: return CDRF_NOTIFYITEMDRAW; case CDDS_ITEMPREPAINT: { COLORREF crText; size_t i = nmcd->nmcd.dwItemSpec; if (g_serversList.size() > i && g_serversList[i].isOfficial) crText = g_browserSettings.officialColor; else crText = 0; nmcd->clrText = crText; return CDRF_DODEFAULT; } } } } break; case LVN_ITEMCHANGED: { LPNMITEMACTIVATE nmitem = (LPNMITEMACTIVATE)lParam; if (nmitem->hdr.hwndFrom == g_hWndListViewServers) { size_t i = nmitem->iItem; if (i != -1 && g_serversList.size() > i) { if (g_serversList[i].info.players == 0) ListView_DeleteAllItems(g_hWndListViewPlayers); std::wstring wstr; ConvertCharset(g_serversList[i].info.serverName.c_str(), wstr); SetDlgItemText(g_hWndGroupBox2, 1001, wstr.c_str()); // Server Name wchar_t ipstr[22]; char *ip = (char *)&(g_serversList[i].address.ip); swprintf_s(ipstr, L"%hhu.%hhu.%hhu.%hhu:%hu", ip[0], ip[1], ip[2], ip[3], g_serversList[i].address.port); SetDlgItemText(g_hWndGroupBox2, 1002, ipstr); // Server IP wchar_t playersstr[12]; swprintf_s(playersstr, L"%hu/%hu", g_serversList[i].info.players, g_serversList[i].info.maxPlayers); SetDlgItemText(g_hWndGroupBox2, 1003, playersstr); // Server Players wchar_t pingsstr[12]; uint32_t ping = g_serversList[i].lastRecv - g_serversList[i].lastPing[1]; _itow_s(ping, pingsstr, 10); SetDlgItemText(g_hWndGroupBox2, 1004, pingsstr); // Server Ping ConvertCharset(g_serversList[i].info.gameMode.c_str(), wstr); SetDlgItemText(g_hWndGroupBox2, 1005, wstr.c_str()); // Server Gamemode SendQuery(g_serversList[i].address, 'i'); SendQuery(g_serversList[i].address, 'c'); g_serversList[i].lastPing[0] = GetTickCount(); } else { ListView_DeleteAllItems(g_hWndListViewPlayers); for (int i = 1001; i <= 1005; ++i) SetDlgItemText(g_hWndGroupBox2, i, nullptr); } } } break; case LVN_ITEMACTIVATE: { LPNMITEMACTIVATE nmia = (LPNMITEMACTIVATE)lParam; if (nmia->hdr.hwndFrom == g_hWndListViewServers) { size_t i = nmia->iItem; if (i != -1 && g_serversList.size() > i) { char ipstr[16]; char *ip = (char *)&(g_serversList[i].address.ip); snprintf(ipstr, sizeof(ipstr), "%hhu.%hhu.%hhu.%hhu", ip[0], ip[1], ip[2], ip[3]); char vcmpDll[MAX_PATH]; snprintf(vcmpDll, sizeof(vcmpDll), "%ls%s\\vcmp-game.dll", g_exePath, g_serversList[i].info.versionName); LaunchVCMP(ipstr, g_serversList[i].address.port, g_browserSettings.playerName, nullptr, g_browserSettings.gamePath, vcmpDll); } } } break; } } break; case WM_SIZE: { int clientWidth = GET_X_LPARAM(lParam), clientHeight = GET_Y_LPARAM(lParam); SetWindowPos(g_hWndTab, 0, 0, 0, clientWidth - UI_PLAYERLIST_WIDTH, clientHeight - UI_SERVERINFO_HEIGHT, SWP_NOZORDER); SetWindowPos(g_hWndListViewServers, 0, 1, 21, clientWidth - UI_PLAYERLIST_WIDTH - 4, clientHeight - UI_SERVERINFO_HEIGHT - 21 - 2, SWP_NOZORDER); SetWindowPos(g_hWndListViewHistory, 0, 1, 21, clientWidth - UI_PLAYERLIST_WIDTH - 4, clientHeight - UI_SERVERINFO_HEIGHT - 21 - 2, SWP_NOZORDER); SetWindowPos(g_hWndGroupBox1, 0, clientWidth - UI_PLAYERLIST_WIDTH, 0, UI_PLAYERLIST_WIDTH, clientHeight - UI_SERVERINFO_HEIGHT, SWP_NOZORDER); SetWindowPos(g_hWndListViewPlayers, 0, clientWidth - UI_PLAYERLIST_WIDTH + 1, 18, UI_PLAYERLIST_WIDTH - 2, clientHeight - UI_SERVERINFO_HEIGHT - 18 - 2, SWP_NOZORDER); SetWindowPos(g_hWndGroupBox2, 0, 0, clientHeight - UI_SERVERINFO_HEIGHT, clientWidth, 118, SWP_NOZORDER); SendMessage(g_hWndStatusBar, WM_SIZE, 0, 0); } break; case WM_GETMINMAXINFO: ((LPMINMAXINFO)lParam)->ptMinTrackSize = { 750, 500 }; break; case WM_DESTROY: if (_hFont) DeleteObject(_hFont); PostQuitMessage(0); break; case WM_SOCKET: { if (WSAGETSELECTEVENT(lParam) == FD_READ) { char *recvBuf = (char *)calloc(1024, sizeof(char)); if (recvBuf) { struct sockaddr_in recvAddr; int addrLen = sizeof(recvAddr); int recvLen = recvfrom(g_UDPSocket, recvBuf, 1024, 0, (sockaddr *)&recvAddr, &addrLen); if (recvLen != -1 && recvLen >= 11) { if (recvLen > 1024) recvLen = 1024; if (*(int *)recvBuf == 0x3430504D) // MP04 { char opcode = recvBuf[10]; if (opcode == 'i' || opcode == 'c') { uint32_t ip = recvAddr.sin_addr.s_addr; uint16_t port = ntohs(recvAddr.sin_port); bool found = false; serverMasterListInfo masterInfo; if (g_currentTab == 1 || g_currentTab == 2) { for (auto it = g_serversMasterList->begin(); it != g_serversMasterList->end(); ++it) { if (it->address.ip == ip && it->address.port == port) { found = true; masterInfo = *it; break; } } } else if (g_currentTab == 3) // Lan { found = true; masterInfo.address = { ip, port }; masterInfo.isOfficial = false; masterInfo.lastPing = lanLastPing; } if (found) { switch (opcode) { case 'i': { serverInfo info; if (GetServerInfo(recvBuf, recvLen, info)) { bool inList = false; for (auto it = g_serversList.begin(); it != g_serversList.end(); ++it) { if (it->address.ip == ip && it->address.port == port) { inList = true; it->lastRecv = GetTickCount(); it->lastPing[1] = it->lastPing[0]; it->info = info; auto i = it - g_serversList.begin(); ListView_Update(g_hWndListViewServers, i); break; } } if (!inList) { serverAllInfo allInfo; allInfo.address = masterInfo.address; allInfo.info = info; allInfo.isOfficial = masterInfo.isOfficial; allInfo.lastPing[0] = masterInfo.lastPing; allInfo.lastPing[1] = masterInfo.lastPing; allInfo.lastRecv = GetTickCount(); g_serversList.push_back(allInfo); LVITEM lvi = { 0 }; ListView_InsertItem(g_hWndListViewServers, &lvi); } } } break; case 'c': { serverPlayers players; if (GetServerPlayers(recvBuf, recvLen, players)) { for (auto it = g_serversList.begin(); it != g_serversList.end(); ++it) { if (it->address.ip == ip && it->address.port == port) { it->lastRecv = GetTickCount(); it->lastPing[1] = it->lastPing[0]; it->players = players; auto i = it - g_serversList.begin(); ListView_SetItemCount(g_hWndListViewPlayers, players.size()); break; } } } } break; } } } } } free(recvBuf); } } } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
BOOL CALLBACK cfgDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { HANDLE_MSG(hwndDlg, WM_COMMAND, WMCommandProc); case WM_DRAWITEM: { DRAWITEMSTRUCT* lpdis = (DRAWITEMSTRUCT*)lParam; int nIdx = FindControlIdx(lpdis->CtlID); #ifdef IO_LINK_UNDERLINED HFONT OldFont; LOGFONT lf; #endif if (nIdx < 0) break; FieldType *pField = pFields + nIdx; #ifdef IO_LINK_UNDERLINED GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf); lf.lfUnderline = TRUE; OldFont = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf)); #endif // We need lpdis->rcItem later RECT rc = lpdis->rcItem; // Calculate needed size of the control DrawText(lpdis->hDC, pField->pszText, -1, &rc, DT_VCENTER | DT_SINGLELINE | DT_CALCRECT); // Make some more room so the focus rect won't cut letters off rc.right = min(rc.right + 2, lpdis->rcItem.right); // Move rect to right if in RTL mode if (bRTL) { rc.left += lpdis->rcItem.right - rc.right; rc.right += lpdis->rcItem.right - rc.right; } if (lpdis->itemAction & ODA_DRAWENTIRE) { // Get TxtColor unless the user has set another using SetCtlColors if (!GetWindowLong(lpdis->hwndItem, GWL_USERDATA)) SetTextColor(lpdis->hDC, (COLORREF) pField->hImage); // Draw the text DrawText(lpdis->hDC, pField->pszText, -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE | (bRTL ? DT_RTLREADING : 0)); } // Draw the focus rect if needed if (((lpdis->itemState & ODS_FOCUS) && (lpdis->itemAction & ODA_DRAWENTIRE)) || (lpdis->itemAction & ODA_FOCUS)) { // NB: when not in DRAWENTIRE mode, this will actually toggle the focus // rectangle since it's drawn in a XOR way DrawFocusRect(lpdis->hDC, &rc); } pField->rect = rc; #ifdef IO_LINK_UNDERLINED DeleteObject(SelectObject(lpdis->hDC, OldFont)); #endif break; } case WM_CTLCOLORSTATIC: case WM_CTLCOLOREDIT: case WM_CTLCOLORDLG: case WM_CTLCOLORBTN: case WM_CTLCOLORLISTBOX: // let the NSIS window handle colors, it knows best return mySendMessage(hMainWindow, uMsg, wParam, lParam); } return 0; }
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static CHOOSEFONT cf ; static int iPage ; static LOGFONT lf ; HDC hdc ; int cxChar, cyChar, x, y, i, cxLabels ; PAINTSTRUCT ps ; SIZE size ; TCHAR szBuffer [8] ; TEXTMETRIC tm ; WCHAR ch ; switch (message) { case WM_CREATE: hdc = GetDC (hwnd) ; lf.lfHeight = - GetDeviceCaps (hdc, LOGPIXELSY) / 6 ; // 12 points lstrcpy (lf.lfFaceName, TEXT ("Lucida Sans Unicode")) ; ReleaseDC (hwnd, hdc) ; cf.lStructSize = sizeof (CHOOSEFONT) ; cf.hwndOwner = hwnd ; cf.lpLogFont = &lf ; cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS ; SetScrollRange (hwnd, SB_VERT, 0, 255, FALSE) ; SetScrollPos (hwnd, SB_VERT, iPage, TRUE ) ; return 0 ; case WM_COMMAND: switch (LOWORD (wParam)) { case IDM_FONT: if (ChooseFont (&cf)) InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; } return 0 ; case WM_VSCROLL: switch (LOWORD (wParam)) { case SB_LINEUP: iPage -= 1 ; break ; case SB_LINEDOWN: iPage += 1 ; break ; case SB_PAGEUP: iPage -= 16 ; break ; case SB_PAGEDOWN: iPage += 16 ; break ; case SB_THUMBPOSITION: iPage = HIWORD (wParam) ; break ; default: return 0 ; } iPage = max (0, min (iPage, 255)) ; SetScrollPos (hwnd, SB_VERT, iPage, TRUE) ; InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; SelectObject (hdc, CreateFontIndirect (&lf)) ; GetTextMetrics (hdc, &tm) ; cxChar = tm.tmMaxCharWidth ; cyChar = tm.tmHeight + tm.tmExternalLeading ; cxLabels = 0 ; for (i = 0 ; i < 16 ; i++) { wsprintf (szBuffer, TEXT (" 000%1X: "), i) ; GetTextExtentPoint (hdc, szBuffer, 7, &size) ; cxLabels = max (cxLabels, size.cx) ; } for (y = 0 ; y < 16 ; y++) { wsprintf (szBuffer, TEXT (" %03X_: "), 16 * iPage + y) ; TextOut (hdc, 0, y * cyChar, szBuffer, 7) ; for (x = 0 ; x < 16 ; x++) { ch = (WCHAR) (256 * iPage + 16 * y + x) ; TextOutW (hdc, x * cxChar + cxLabels, y * cyChar, &ch, 1); } } DeleteObject (SelectObject (hdc, GetStockObject (SYSTEM_FONT))); EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }