/* * Dialog-box function for the main PuTTYgen dialog box. */ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static const char generating_msg[] = "Please wait while a key is generated..."; static const char entropy_msg[] = "Please generate some randomness by moving the mouse over the blank area."; struct MainDlgState *state; switch (msg) { case WM_INITDIALOG: if (has_help()) SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP); else { /* * If we add a Help button, this is where we destroy it * if the help file isn't present. */ } SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(200))); state = snew(struct MainDlgState); state->generation_thread_exists = FALSE; state->collecting_entropy = FALSE; state->entropy = NULL; state->key_exists = FALSE; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) state); { HMENU menu, menu1; menu = CreateMenu(); menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_LOAD, "&Load private key"); AppendMenu(menu1, MF_ENABLED, IDC_SAVEPUB, "Save p&ublic key"); AppendMenu(menu1, MF_ENABLED, IDC_SAVE, "&Save private key"); AppendMenu(menu1, MF_SEPARATOR, 0, 0); AppendMenu(menu1, MF_ENABLED, IDC_QUIT, "E&xit"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&File"); state->filemenu = menu1; menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_GENERATE, "&Generate key pair"); AppendMenu(menu1, MF_SEPARATOR, 0, 0); AppendMenu(menu1, MF_ENABLED, IDC_KEYSSH1, "SSH-&1 key (RSA)"); AppendMenu(menu1, MF_ENABLED, IDC_KEYSSH2RSA, "SSH-2 &RSA key"); AppendMenu(menu1, MF_ENABLED, IDC_KEYSSH2DSA, "SSH-2 &DSA key"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Key"); state->keymenu = menu1; menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_IMPORT, "&Import key"); AppendMenu(menu1, MF_SEPARATOR, 0, 0); AppendMenu(menu1, MF_ENABLED, IDC_EXPORT_OPENSSH, "Export &OpenSSH key"); AppendMenu(menu1, MF_ENABLED, IDC_EXPORT_SSHCOM, "Export &ssh.com key"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "Con&versions"); state->cvtmenu = menu1; menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_ABOUT, "&About"); if (has_help()) AppendMenu(menu1, MF_ENABLED, IDC_GIVEHELP, "&Help"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Help"); SetMenu(hwnd, menu); } /* * Centre the window. */ { /* centre the window */ RECT rs, rd; HWND hw; hw = GetDesktopWindow(); if (GetWindowRect(hw, &rs) && GetWindowRect(hwnd, &rd)) MoveWindow(hwnd, (rs.right + rs.left + rd.left - rd.right) / 2, (rs.bottom + rs.top + rd.top - rd.bottom) / 2, rd.right - rd.left, rd.bottom - rd.top, TRUE); } { struct ctlpos cp, cp2; /* Accelerators used: acglops1rbd */ ctlposinit(&cp, hwnd, 4, 4, 4); beginbox(&cp, "Key", IDC_BOX_KEY); cp2 = cp; statictext(&cp2, "No key.", 1, IDC_NOKEY); cp2 = cp; statictext(&cp2, "", 1, IDC_GENERATING); progressbar(&cp2, IDC_PROGRESS); bigeditctrl(&cp, "&Public key for pasting into authorized_keys file:", IDC_PKSTATIC, IDC_KEYDISPLAY, 5); SendDlgItemMessage(hwnd, IDC_KEYDISPLAY, EM_SETREADONLY, 1, 0); staticedit(&cp, "Key f&ingerprint:", IDC_FPSTATIC, IDC_FINGERPRINT, 75); SendDlgItemMessage(hwnd, IDC_FINGERPRINT, EM_SETREADONLY, 1, 0); staticedit(&cp, "Key &comment:", IDC_COMMENTSTATIC, IDC_COMMENTEDIT, 75); staticpassedit(&cp, "Key p&assphrase:", IDC_PASSPHRASE1STATIC, IDC_PASSPHRASE1EDIT, 75); staticpassedit(&cp, "C&onfirm passphrase:", IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2EDIT, 75); endbox(&cp); beginbox(&cp, "Actions", IDC_BOX_ACTIONS); staticbtn(&cp, "Generate a public/private key pair", IDC_GENSTATIC, "&Generate", IDC_GENERATE); staticbtn(&cp, "Load an existing private key file", IDC_LOADSTATIC, "&Load", IDC_LOAD); static2btn(&cp, "Save the generated key", IDC_SAVESTATIC, "Save p&ublic key", IDC_SAVEPUB, "&Save private key", IDC_SAVE); endbox(&cp); beginbox(&cp, "Parameters", IDC_BOX_PARAMS); radioline(&cp, "Type of key to generate:", IDC_TYPESTATIC, 3, "SSH-&1 (RSA)", IDC_KEYSSH1, "SSH-2 &RSA", IDC_KEYSSH2RSA, "SSH-2 &DSA", IDC_KEYSSH2DSA, NULL); staticedit(&cp, "Number of &bits in a generated key:", IDC_BITSSTATIC, IDC_BITS, 20); endbox(&cp); } CheckRadioButton(hwnd, IDC_KEYSSH1, IDC_KEYSSH2DSA, IDC_KEYSSH2RSA); CheckMenuRadioItem(state->keymenu, IDC_KEYSSH1, IDC_KEYSSH2DSA, IDC_KEYSSH2RSA, MF_BYCOMMAND); SetDlgItemInt(hwnd, IDC_BITS, DEFAULT_KEYSIZE, FALSE); /* * Initially, hide the progress bar and the key display, * and show the no-key display. Also disable the Save * buttons, because with no key we obviously can't save * anything. */ ui_set_state(hwnd, state, 0); /* * Load a key file if one was provided on the command line. */ if (cmdline_keyfile) load_key_file(hwnd, state, filename_from_str(cmdline_keyfile), 0); return 1; case WM_MOUSEMOVE: state = (struct MainDlgState *) GetWindowLongPtr(hwnd, GWLP_USERDATA); if (state->collecting_entropy && state->entropy && state->entropy_got < state->entropy_required) { state->entropy[state->entropy_got++] = lParam; state->entropy[state->entropy_got++] = GetMessageTime(); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, state->entropy_got, 0); if (state->entropy_got >= state->entropy_required) { struct rsa_key_thread_params *params; DWORD threadid; /* * Seed the entropy pool */ random_add_heavynoise(state->entropy, state->entropy_size); memset(state->entropy, 0, state->entropy_size); sfree(state->entropy); state->collecting_entropy = FALSE; SetDlgItemText(hwnd, IDC_GENERATING, generating_msg); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, PROGRESSRANGE)); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, 0, 0); params = snew(struct rsa_key_thread_params); params->progressbar = GetDlgItem(hwnd, IDC_PROGRESS); params->dialog = hwnd; params->keysize = state->keysize; params->is_dsa = state->is_dsa; params->key = &state->key; params->dsskey = &state->dsskey; if (!CreateThread(NULL, 0, generate_rsa_key_thread, params, 0, &threadid)) { MessageBox(hwnd, "Out of thread resources", "Key generation error", MB_OK | MB_ICONERROR); sfree(params); } else { state->generation_thread_exists = TRUE; } } } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_KEYSSH1: case IDC_KEYSSH2RSA: case IDC_KEYSSH2DSA: { state = (struct MainDlgState *) GetWindowLongPtr(hwnd, GWLP_USERDATA); if (!IsDlgButtonChecked(hwnd, LOWORD(wParam))) CheckRadioButton(hwnd, IDC_KEYSSH1, IDC_KEYSSH2DSA, LOWORD(wParam)); CheckMenuRadioItem(state->keymenu, IDC_KEYSSH1, IDC_KEYSSH2DSA, LOWORD(wParam), MF_BYCOMMAND); } break; case IDC_QUIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break; case IDC_COMMENTEDIT: if (HIWORD(wParam) == EN_CHANGE) { state = (struct MainDlgState *) GetWindowLongPtr(hwnd, GWLP_USERDATA); if (state->key_exists) { HWND editctl = GetDlgItem(hwnd, IDC_COMMENTEDIT); int len = GetWindowTextLength(editctl); if (*state->commentptr) sfree(*state->commentptr); *state->commentptr = snewn(len + 1, char); GetWindowText(editctl, *state->commentptr, len + 1); if (state->ssh2) { setupbigedit2(hwnd, IDC_KEYDISPLAY, IDC_PKSTATIC, &state->ssh2key); } else { setupbigedit1(hwnd, IDC_KEYDISPLAY, IDC_PKSTATIC, &state->key); } } }
/*** Will be called before the first display of the dialog *******************/ BOOL CCalendarDlg2::OnInitDialog() { m_mcMonthCal.SetHolidaysFromFile(_T("HOLIDAYS.INI")); m_mcMonthCal.pDelegates=this; CResizeableDialog::OnInitDialog(); // ֿאנסטל פאיכ CString sContent; ReadFile(sMainFile,sContent); sContent.Replace("\r\n","\n"); sContent=CString("\n")+sContent+"\n"; while(sContent!="") { CString sLine=sContent.SpanExcluding("\n"); if(sLine!="") { aItems.Add(sLine); if(sContent.GetLength()>sLine.GetLength()) { sContent=sContent.Mid(sLine.GetLength()+1); } else { sContent=""; } } sContent.TrimLeft(); } LRESULT lRes=0; NMDAYSTATE pDayState; SYSTEMTIME stMinRange, stMaxRange; memset(&pDayState,0,sizeof(pDayState)); m_mcMonthCal.GetMonthRange(&stMinRange, &stMaxRange, GMR_DAYSTATE); pDayState.cDayState=(stMaxRange.wYear - stMinRange.wYear) * 12 + stMaxRange.wMonth - stMinRange.wMonth + 1; memcpy(&pDayState.stStart,&stMinRange,sizeof(SYSTEMTIME)); OnGetdaystate((NMHDR*)&pDayState,&lRes); //pDayState.prgDayState[0]=0xffff; //memset(pDayState.prgDayState,555,5*sizeof(MONTHDAYSTATE)); m_mcMonthCal.SetDayState(pDayState.cDayState,pDayState.prgDayState); m_mcMonthCal.Invalidate(); //----------------------------------- // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon GetDlgItem(IDC_STATIC1)->SetWindowText(_l(sStatic1)); GetDlgItem(IDC_STATIC2)->SetWindowText(_l(sStatic2)); SetWindowText(_l(sTitle)); GetDlgItem(IDOK)->SetWindowText(_l(sButton)); GetDlgItem(IDCLEAR)->SetWindowText(_l("Clear field")); // Register resizable controls RegisterControl(IDC_STATIC1, ATTACH_TO_TOP_EDGE | ATTACH_TO_VERTICAL_EDGES); RegisterControl(IDC_MONTHCALENDAR1, ATTACH_TO_TOP_EDGE | ATTACH_TO_VERTICAL_EDGES); RegisterControl(IDC_STATIC2, ATTACH_TO_TOP_EDGE | ATTACH_TO_VERTICAL_EDGES); RegisterControl(IDC_EDIT_TXT, ATTACH_TO_TOP_EDGE | ATTACH_TO_VERTICAL_EDGES); RegisterControl(IDC_STATIC3, ATTACH_TO_BOTTOM_EDGE | ATTACH_TO_LEFT_EDGE); RegisterControl(IDCLEAR, ATTACH_TO_BOTTOM_EDGE | ATTACH_TO_LEFT_EDGE); RegisterControl(IDOK, ATTACH_TO_BOTTOM_EDGE | ATTACH_TO_RIGHT_EDGE); // Calculate minimum and maximum size of calendar window CRect rect; m_mcMonthCal.GetClientRect(rect); int nWidth = rect.Width(); int nHeight = rect.Height(); if (m_mcMonthCal.GetMinReqRect(rect)) { int nMinWidth = rect.Width(); int nMinHeight = rect.Height(); int nDiffWidth = nMinWidth - nWidth; int nDiffHeight = nMinHeight - nHeight; CRect rectOffset(nDiffWidth/2, nDiffHeight/2, nDiffWidth/2 + nDiffWidth%2, nDiffHeight/2 + nDiffHeight%2); GetWindowRect(rect); rect += rectOffset; MoveWindow(rect); ThisSizeIsMinSize(); int nMaxWidth = nMinWidth * 2 + 6*(3-1); int nMaxHeight = nMinHeight * 2 + 13*(4-1); nDiffWidth = nMaxWidth - nWidth; nDiffHeight = nMaxHeight - nHeight; rectOffset = CRect(nDiffWidth/2, nDiffHeight/2, nDiffWidth/2 + nDiffWidth%2, nDiffHeight/2 + nDiffHeight%2); GetWindowRect(rect); rect += rectOffset; int nScreenWidth = GetSystemMetrics(SM_CXSCREEN); int nScreenHeight = GetSystemMetrics(SM_CYSCREEN); if (rect.Width() > nScreenWidth) { rect.left = 0; rect.right = nScreenWidth-1; } if (rect.Height() > nScreenHeight) { rect.top = 0; rect.bottom = nScreenHeight-1; } m_nMaxWidth = m_nMinWidth*2; m_nMaxHeight = m_nMinHeight; /* MoveWindow(rect); ThisSizeIsMaxSize(); CRect rtBegin(rect); MoveWindow(rtBegin); */ } SYSTEMTIME sysTime; GetSystemTime(&sysTime); BOOL bResult = (BOOL)::SendMessage(m_mcMonthCal, MCM_SETCURSEL, 0, (LPARAM) &sysTime); SetTextForDay(&sysTime); return TRUE; // return TRUE unless you set the focus to a control }
static UINT_PTR WINAPI resize_template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) { static RECT initrc, rc; static int index, count; static int gotSWP_bottom, gotShowWindow; HWND parent = GetParent( dlg); int resize; #define MAXNRCTRLS 30 static RECT ctrlrcs[MAXNRCTRLS]; static int ctrlids[MAXNRCTRLS]; static HWND ctrls[MAXNRCTRLS]; static int nrctrls; switch( msg) { case WM_INITDIALOG: { DWORD style; index = ((OPENFILENAME*)lParam)->lCustData; count = 0; gotSWP_bottom = gotShowWindow = 0; /* test style */ style = GetWindowLong( parent, GWL_STYLE); if( resize_testcases[index].flags & OFN_ENABLESIZING) if( !(style & WS_SIZEBOX)) { win_skip( "OFN_ENABLESIZING flag not supported.\n"); resizesupported = FALSE; PostMessage( parent, WM_COMMAND, IDCANCEL, 0); } else ok( style & WS_SIZEBOX, "testid %d: dialog should have a WS_SIZEBOX style.\n", index); else ok( !(style & WS_SIZEBOX), "testid %d: dialog should not have a WS_SIZEBOX style.\n", index); break; } case WM_NOTIFY: { if(( (LPNMHDR)lParam)->code == CDN_FOLDERCHANGE){ GetWindowRect( parent, &initrc); if( (resize = resize_testcases[index].resize_folderchange)){ MoveWindow( parent, initrc.left,initrc.top, initrc.right - initrc.left + resize, initrc.bottom - initrc.top + resize, TRUE); } SetTimer( dlg, 0, 100, 0); } break; } case WM_TIMER: { if( count == 0){ /* store the control rectangles */ if( resize_testcases[index].testcontrols) { HWND ctrl; int i; for( i = 0, ctrl = GetWindow( parent, GW_CHILD); i < MAXNRCTRLS && ctrl; i++, ctrl = GetWindow( ctrl, GW_HWNDNEXT)) { ctrlids[i] = GetDlgCtrlID( ctrl); GetWindowRect( ctrl, &ctrlrcs[i]); MapWindowPoints( NULL, parent, (LPPOINT) &ctrlrcs[i], 2); ctrls[i] = ctrl; } nrctrls = i; } if( (resize = resize_testcases[index].resize_timer1)){ GetWindowRect( parent, &rc); MoveWindow( parent, rc.left,rc.top, rc.right - rc.left + resize, rc.bottom - rc.top + resize, TRUE); } } else if( count == 1){ resize = resize_testcases[index].resize_check; GetWindowRect( parent, &rc); if( resize_testcases[index].todo){ todo_wine { ok( resize == rc.right - rc.left - initrc.right + initrc.left, "testid %d size-x change %d expected %d\n", index, rc.right - rc.left - initrc.right + initrc.left, resize); ok( resize == rc.bottom - rc.top - initrc.bottom + initrc.top, "testid %d size-y change %d expected %d\n", index, rc.bottom - rc.top - initrc.bottom + initrc.top, resize); } }else{ ok( resize == rc.right - rc.left - initrc.right + initrc.left, "testid %d size-x change %d expected %d\n", index, rc.right - rc.left - initrc.right + initrc.left, resize); ok( resize == rc.bottom - rc.top - initrc.bottom + initrc.top, "testid %d size-y change %d expected %d\n", index, rc.bottom - rc.top - initrc.bottom + initrc.top, resize); } if( resize_testcases[index].testcontrols) { int i; RECT rc; for( i = 0; i < nrctrls; i++) { GetWindowRect( ctrls[i], &rc); MapWindowPoints( NULL, parent, (LPPOINT) &rc, 2); switch( ctrlids[i]){ /* test if RECT R1, moved and sized result in R2 */ #define TESTRECTS( R1, R2, Mx, My, Sx, Sy) \ ((R1).left + (Mx) ==(R2).left \ &&(R1).top + (My) ==(R2).top \ &&(R1).right + (Mx) + (Sx) == (R2).right \ &&(R1).bottom + (My) + (Sy) ==(R2).bottom) /* sized horizontal and moved vertical */ case cmb1: case edt1: ok( TESTRECTS( ctrlrcs[i], rc, 0, 10, 10, 0), "control id %03x should have sized horizontally and moved vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, ctrlrcs[i].right, ctrlrcs[i].bottom, rc.left, rc.top, rc.right, rc.bottom); break; /* sized horizontal and vertical */ case lst2: ok( TESTRECTS( ctrlrcs[i], rc, 0, 0, 10, 10), "control id %03x should have sized horizontally and vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, ctrlrcs[i].right, ctrlrcs[i].bottom, rc.left, rc.top, rc.right, rc.bottom); break; /* moved horizontal and vertical */ case IDCANCEL: case pshHelp: ok( TESTRECTS( ctrlrcs[i], rc, 10, 10, 0, 0), "control id %03x should have moved horizontally and vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, ctrlrcs[i].right, ctrlrcs[i].bottom, rc.left, rc.top, rc.right, rc.bottom); break; /* moved vertically */ case chx1: case stc2: case stc3: ok( TESTRECTS( ctrlrcs[i], rc, 0, 10, 0, 0), "control id %03x should have moved vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, ctrlrcs[i].right, ctrlrcs[i].bottom, rc.left, rc.top, rc.right, rc.bottom); break; /* resized horizontal */ case cmb2: /* aka IDC_LOOKIN */ ok( TESTRECTS( ctrlrcs[i], rc, 0, 0, 10, 0)|| TESTRECTS( ctrlrcs[i], rc, 0, 0, 0, 0), /* Vista and higher */ "control id %03x should have resized horizontally, before %d,%d-%d,%d after %d,%d-%d,%d\n", ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, ctrlrcs[i].right, ctrlrcs[i].bottom, rc.left, rc.top, rc.right, rc.bottom); break; /* non moving non sizing controls */ case stc4: ok( TESTRECTS( rc, ctrlrcs[i], 0, 0, 0, 0), "control id %03x was moved/resized, before %d,%d-%d,%d after %d,%d-%d,%d\n", ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, ctrlrcs[i].right, ctrlrcs[i].bottom, rc.left, rc.top, rc.right, rc.bottom); break; /* todo_wine: non moving non sizing controls */ case lst1: todo_wine ok( TESTRECTS( rc, ctrlrcs[i], 0, 0, 0, 0), "control id %03x was moved/resized, before %d,%d-%d,%d after %d,%d-%d,%d\n", ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, ctrlrcs[i].right, ctrlrcs[i].bottom, rc.left, rc.top, rc.right, rc.bottom); break; /* don't test: id is not unique */ case IDOK: case stc1: case 0: case -1: break; default: trace("untested control id %03x before %d,%d-%d,%d after %d,%d-%d,%d\n", ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, ctrlrcs[i].right, ctrlrcs[i].bottom, rc.left, rc.top, rc.right, rc.bottom); #undef TESTRECTS #undef MAXNRCTRLS } } } KillTimer( dlg, 0); PostMessage( parent, WM_COMMAND, IDCANCEL, 0); }
/*-------------------------------*/ LRESULT CALLBACK WndProc(HWND hWnd, UINT komunikat, WPARAM wParam, LPARAM lParam) { static BOOL bDragging; static int poz; POINT pkt; HIMAGELIST hDragImgList; static NOTIFYICONDATA nim; switch (komunikat) { case WM_CREATE: HWND hToolTip; HFONT hFont; TOOLINFO tinf; RECT rect; /*-----tworzenie kontrolek-----*/ hList = CreateWindow("SysListView32", "lista_przyciskow", WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_REPORT | LVS_SINGLESEL,0,0,493,230,hWnd,NULL,hInst, NULL); hRefresh = CreateWindow("button", "Odœwie¿ listê", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 135, 232, 100, 20, hWnd, NULL, hInst, NULL); hShow = CreateWindow("button", "Poka¿ przycisk", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 15, 232, 100, 20,/*255, 232, 100, 20,*/ hWnd, NULL, hInst, NULL); hInfo = CreateWindow("button", "O programie...", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 375, 232, 100, 20, hWnd, NULL, hInst, NULL); /*-----tworzenie i ustawianie czcionki dla przycisków-----*/ hFont = CreateFont(14, 0, 0, 0, 0, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL); SendMessage(hRefresh, WM_SETFONT, (WPARAM) hFont, true); SendMessage(hShow, WM_SETFONT, (WPARAM) hFont, true); SendMessage(hInfo, WM_SETFONT, (WPARAM) hFont, true); ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP); /*-----ustawianie tooltipów-----*/ hToolTip = CreateWindow(TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP | TTS_BALLOON, 0,0,0,0, hWnd, NULL, hInst, NULL); //Ustawianie parametrów wspó³nych dla ka¿dego tooltipa: tytu³, kolor. SendMessage(hToolTip, TTM_SETTITLE, TTI_INFO, (LPARAM)"Skrót"); SendMessage(hToolTip, TTM_SETTIPTEXTCOLOR, (LPARAM)RGB(0, 0, 100), 0); SendMessage(hToolTip, TTM_SETTIPBKCOLOR, (LPARAM)RGB(250, 250, 250), 0); GetClientRect (hWnd, &rect); tinf.cbSize = sizeof(TOOLINFO); tinf.uFlags = TTF_SUBCLASS; tinf.hinst = hInst; tinf.uId = 0; tinf.rect.left = rect.left; tinf.rect.top = rect.top; tinf.rect.right = rect.right; tinf.rect.bottom = rect.bottom; tinf.hwnd = hRefresh; tinf.lpszText = "F5"; SendMessage(hToolTip, TTM_ADDTOOL, 0, (LPARAM)&tinf); tinf.hwnd = hShow; tinf.lpszText = "dwuklik LPM"; SendMessage(hToolTip, TTM_ADDTOOL, 0, (LPARAM)&tinf); tinf.hwnd = hInfo; tinf.lpszText = "F1"; SendMessage(hToolTip, TTM_ADDTOOL, 0, (LPARAM)&tinf); /*-----ustawianie ikony programu w zasobniku systemowym-----*/ nim.cbSize = sizeof(NOTIFYICONDATA); nim.hWnd = hWnd; nim.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nim.hIcon = ikona; nim.uCallbackMessage = WM_TRAY; nim.uID = 7; lstrcpyn(nim.szTip, "Manipulator by FeniX", sizeof(nim.szTip)); Shell_NotifyIcon(NIM_ADD, &nim); refresh(); break; case WM_KEYUP: //obs³uga skrótów klawiaturowych dla konkretnych akcji switch (wParam) { case VK_F5: SendMessage(hRefresh, BM_CLICK, 0, 0); break; case VK_F1: SendMessage(hInfo, BM_CLICK, 0, 0); break; case VK_SPACE: SendMessage(hShow, BM_CLICK, 0, 0); break; case VK_ESCAPE: ShowWindow(hWnd, SW_MINIMIZE); break; } break; case WM_COMMAND: //obs³uga zdarzeñ okien pochodnych okna g³ównego switch (HIWORD(wParam)) { case BN_CLICKED: //komunikat klikniêcia przycisku if ((HWND)lParam == hRefresh) { refresh(); SetFocus(hList); } else if ((HWND)lParam == hInfo) { MessageBox(hWnd, "Autor:\nKonrad Gadzina <*****@*****.**>\n" "Grupa 1131, Informatyka, rok akad. 2008/2009" "\nPracownia In¿ynierii Oprogramowania M-74\n" "Instytut Informatyki Stosowanej\n" "Wydzia³ Mechaniczny, Politechnika Krakowska\nJêzyki i Techniki Programowania", "O programie", MB_OK); } else if ((HWND)lParam == hShow) { int poz; char buf[10]; bool hidden; TBBUTTON *ptbb, tbb; NOTIFYICONDATA fake; //potrzebne do "odswiezania" paska zadan i dopasowywania szerokosci przyciskow ptbb = (TBBUTTON*)VirtualAllocEx(proces, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE); poz = ListView_GetNextItem(hList, (WPARAM)-1, LVNI_SELECTED); SendMessage(hPasek, TB_GETBUTTON, (WPARAM)poz, (LPARAM)ptbb); ReadProcessMemory(proces, (void*)ptbb, (void*)&tbb, sizeof(TBBUTTON), NULL); hidden = SendMessage(hPasek, TB_ISBUTTONHIDDEN, (WPARAM)tbb.idCommand, 0); SendMessage(hPasek, TB_HIDEBUTTON, (WPARAM)tbb.idCommand, (LPARAM)!hidden); if (hidden) SendMessage(hShow, WM_SETTEXT, 0, (LPARAM)"Ukryj przycisk"); else SendMessage(hShow, WM_SETTEXT, 0, (LPARAM)"Poka¿ przycisk"); /*---dodawanie i usuwanie ikony do zasobnika, by pasek zadañ siê "odœwie¿y³"---*/ fake.cbSize = sizeof(NOTIFYICONDATA); fake.hWnd = hWnd; fake.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; fake.hIcon = ikona; fake.uCallbackMessage = WM_TRAY; fake.uID = 19; lstrcpyn(fake.szTip, "Manipulator by FeniX", sizeof(fake.szTip)); Shell_NotifyIcon(NIM_ADD, &fake); Shell_NotifyIcon(NIM_DELETE, &fake); for (int i = 0; i<ile; i++) { SendMessage(hPasek, TB_GETBUTTON, (WPARAM)i, (LPARAM)ptbb); ReadProcessMemory(proces, (void*)ptbb, (void*)&tbb, sizeof(TBBUTTON), NULL); hidden = SendMessage(hPasek, TB_ISBUTTONHIDDEN, (WPARAM)tbb.idCommand, 0); if (!hidden) strcpy(buf, "[widoczny]"); else strcpy(buf, "[ukryty]"); ListView_SetItemText(hList, i, 1, buf); } SetFocus(hList); VirtualFreeEx(proces, ptbb, 0, MEM_RELEASE); } break; } break; case WM_TRAY: //obs³uga klikniêcia na ikonkê programu w zasobniku systemowym switch ((UINT)lParam) { case WM_LBUTTONDOWN: if (!IsWindowVisible(hWnd)) { if (IsZoomed(hWnd)) ShowWindow(hWnd, SW_MAXIMIZE); else ShowWindow(hWnd, SW_RESTORE); SetForegroundWindow(hWnd); } else if (GetForegroundWindow() == hWnd) ShowWindow(hWnd, SW_HIDE); else SetForegroundWindow(hWnd); break; } break; case WM_ACTIVATE: if (LOWORD(wParam) != WA_INACTIVE) refresh(); break; case WM_SIZE: //zdarzenie zmienienia rozmiaru int szer, wys; if (wParam & SIZE_MINIMIZED) ShowWindow(hWnd, SW_HIDE); szer = (int)LOWORD(lParam); wys = (int)HIWORD(lParam ); /* Poni¿ze linijki pozwalaj¹ przestawiaæ kontrolki tak, by dopasowa ich pozycjê/rozmiar do rozmiaru okna g³ównego */ MoveWindow(hList, 0, 0, szer, wys-23, false); MoveWindow(hShow, 20, wys-21, 120, 20, false); MoveWindow(hRefresh, szer-310, wys-21, 120, 20, false); MoveWindow(hInfo, szer-140, wys-21, 120, 20, false); break; case WM_SIZING: //zdarzenie zmieniania rozmiaru RECT* rc; rc = (RECT*)lParam; /* Poni¿sze linie pozwalaj¹ ograniczyc rozmiar okna - jako, ¿e to zdarzenie jest wywo³ywane w trakcie zmiany rozmiaru, warunki s¹ sprawdzane nie po puszczeniu przycisku myszy, a jeszcze w trakcie jego trzymania. Dziêki temu okno nie nigdy nie bêdzie mia³o rozmiarów mniejszych ni¿ 500x100 pikseli. */ if (rc->right - rc->left <= 500) rc->right = rc->left + 500; if (rc->bottom - rc->top <= 100) rc->bottom = rc->top + 100; break; case WM_DESTROY: //zdarzenie niszczenia okna CloseHandle(proces); Shell_NotifyIcon(NIM_DELETE, &nim); PostQuitMessage(0); break; case WM_NOTIFY: //obs³uga komunikatów od kontrolki ListView if (((LPNMHDR)lParam)->hwndFrom == hList && ((LPNMHDR)lParam)->code == (unsigned int)NM_DBLCLK) SendMessage(hShow, BM_CLICK, 0, 0); else if (((LPNMHDR)lParam)->hwndFrom == hList && ((LPNMHDR)lParam)->code == (unsigned int)NM_CLICK) { char buf[10]; int poz = ListView_GetNextItem(hList, (WPARAM)-1, LVNI_SELECTED); ListView_GetItemText(hList, poz, 1, buf, 50); if (!strcmp(buf, "[ukryty]")) SendMessage(hShow, WM_SETTEXT, 0, (LPARAM)"Poka¿ przycisk"); else SendMessage(hShow, WM_SETTEXT, 0, (LPARAM)"Ukryj przycisk"); } else if (((LPNMHDR)lParam)->hwndFrom == hList && ((LPNMHDR)lParam)->code == LVN_KEYDOWN) { switch (((LV_KEYDOWN*)lParam)->wVKey) { case VK_F5: SendMessage(hRefresh, BM_CLICK, 0, 0); break; case VK_F1: SendMessage(hInfo, BM_CLICK, 0, 0); break; case VK_SPACE: SendMessage(hShow, BM_CLICK, 0, 0); break; case VK_ESCAPE: ShowWindow(hWnd, SW_MINIMIZE); break; } } /*------------------- obs³uga drag & drop na liœcie z przyciskami -------------------*/ else if (((LPNMHDR)lParam)->hwndFrom == hList && ((LPNMHDR)lParam)->code == LVN_BEGINDRAG) { //wiadomoœæ wysy³ana do okna g³ównego, gdy rozpoczynamy drag & drop na liœcie //czyli ³apiemy element lewym przyciskiem myszy HIMAGELIST hOneImageList, hTempImageList; IMAGEINFO imginf; int x = 0, wys; pkt.x = 1; pkt.y = 1; poz = ListView_GetNextItem(hList, (WPARAM)-1, LVNI_SELECTED); //pobieranie indexu zaznaczonego elementu item.iItem = poz; item.mask = LVIF_IMAGE | LVIF_INDENT | LVIF_PARAM; //ustawienie maski elementu listy do pobrania ListView_GetItem(hList, &item); //pobieranie danego elementu do zmiennej item if (item.iIndent) //element z wciêciem nas nie interesuje break; hDragImgList = ListView_CreateDragImage(hList, poz, &pkt); //tworzenie "duszka" do d&d ImageList_GetImageInfo(hDragImgList, 0, &imginf); wys = imginf.rcImage.bottom; while(true) //dodawanie elementów danej grupy do "duszka" w pêtli { if (++item.iItem >= ile) break; item.mask = LVIF_IMAGE | LVIF_INDENT | LVIF_PARAM; //ustawianie maski pobierania danych elementu ListView_GetItem(hList, &item); if(item.iIndent == 0) //je¿eli napotkano kolejny przycisk grupowy trzeba przerwaæ break; hOneImageList = ListView_CreateDragImage(hList, item.iItem, &pkt); hTempImageList = ImageList_Merge(hDragImgList, 0, hOneImageList, 0, 0, wys); ImageList_Destroy(hDragImgList); ImageList_Destroy(hOneImageList); hDragImgList = hTempImageList; ImageList_GetImageInfo(hDragImgList, 0, &imginf); wys = imginf.rcImage.bottom; } item.iItem = poz; item.mask = LVIF_IMAGE | LVIF_INDENT | LVIF_PARAM; ListView_GetItem(hList, &item); ImageList_BeginDrag(hDragImgList, 0, x, 0); pkt = ((NM_LISTVIEW*) ((LPNMHDR)lParam))->ptAction; ClientToScreen(hList, &pkt); ImageList_DragEnter(GetDesktopWindow(), pkt.x, pkt.y); bDragging = true; SetCapture(hWnd); } break; case WM_MOUSEMOVE: //zdarzenie ruchu kursora myszy if (!bDragging) //je¿eli nie obs³gujemy akurat d&d na liœcie to nie trzeba nic robiæ break; pkt.x = LOWORD(lParam); pkt.y = HIWORD(lParam); ClientToScreen(hWnd, &pkt); ImageList_DragMove(pkt.x, pkt.y); break; case WM_LBUTTONUP: //zdarzenie puszczenia lewego przycisku myszy if (!bDragging) //je¿eli nie obs³gujemy akurat d&d na liœcie to nie trzeba nic robiæ break; LVHITTESTINFO lvhti; char buf[256], sub[12]; /*---puszczamy przycisk, wiêc przeci¹ganie siê koñczy---*/ bDragging = false; ImageList_DragLeave(hList); ImageList_EndDrag(); //ImageList_Destroy(hDragImgList); //nie wiem czemu, ale ta linia wywo³uje b³¹d segfault przy uruchomieniu debuggera ReleaseCapture(); /*---sprawdzanie, czy przeci¹gany element zosta³ upuszczony na inny element listy---*/ lvhti.pt.x = LOWORD(lParam); lvhti.pt.y = HIWORD(lParam); ClientToScreen(hWnd, &lvhti.pt); ScreenToClient(hList, &lvhti.pt); ListView_HitTest(hList, &lvhti); if (lvhti.iItem == -1) break; if ((lvhti.flags & LVHT_ONITEMLABEL == 0) && (lvhti.flags & LVHT_ONITEMSTATEICON == 0)) break; if (!item.iIndent) //je¿eli wciêcie = 0, to znaczy ¿e zajmujemy siê przyciskiem "grupowym" { poz = ListView_GetNextItem(hList, (WPARAM)-1, LVNI_SELECTED); if (lvhti.iItem > poz) lvhti.iItem++; while (true) { if (lvhti.iItem == poz || lvhti.iItem > ile-1 || lvhti.iItem < 0) break; item.iItem = lvhti.iItem; item.iSubItem = 0; item.mask = LVIF_STATE | LVIF_IMAGE | LVIF_INDENT | LVIF_TEXT | LVIF_PARAM; item.stateMask = LVIS_SELECTED; ListView_GetItem(hList, &item); if (item.iIndent) { if (lvhti.iItem > poz) lvhti.iItem++; else if (lvhti.iItem < poz) lvhti.iItem--; } else { if (lvhti.iItem > poz) lvhti.iItem--; break; } } ListView_GetItemText(hList, poz, 0, buf, 256); //pobieranie tekstu danego elementu listy while (true) { int tmp = poz; item.iItem = poz; item.iSubItem = 0; item.cchTextMax = 256; item.pszText = buf; item.stateMask = ~LVIS_SELECTED; item.mask = LVIF_STATE | LVIF_IMAGE | LVIF_INDENT | LVIF_TEXT | LVIF_PARAM; ListView_GetItem(hList, &item); ListView_GetItemText(hList, poz, 1, sub, 12); SendMessage(hPasek, TB_MOVEBUTTON, (WPARAM)poz, (LPARAM)lvhti.iItem); if (lvhti.iItem > poz && lvhti.iItem < ile) lvhti.iItem++; item.iItem = lvhti.iItem; ListView_InsertItem(hList, &item); ListView_SetItemText(hList, item.iItem, 1, sub); if (lvhti.iItem < poz) poz++; ListView_DeleteItem(hList, poz); if (lvhti.iItem > tmp) lvhti.iItem--; if (lvhti.iItem < tmp) lvhti.iItem++; ListView_GetItemText(hList, poz, 0, buf, 256); item.iItem = poz; item.iSubItem = 0; item.cchTextMax = 256; item.pszText = buf; ListView_GetItem(hList, &item); if (!item.iIndent || poz > ile-1) //je¿eli break; } } break; default: return DefWindowProc(hWnd, komunikat, wParam, lParam); } return 0; }
int COXListPopup::Pick(CRect rect, CRect rectParent) { AdjustDisplayRectangle(rect, rectParent); MoveWindow(rect); ShowWindow(SW_SHOWNA); SetCapture(); // init message loop bool bBreak = false; int iReturnItemIdx = -1; while (!bBreak) { MSG msg; VERIFY(::GetMessage(&msg, NULL, 0, 0)); if (msg.message == WM_LBUTTONUP) { // Get the item under the mouse cursor int xPos = GET_X_LPARAM(msg.lParam); int yPos = GET_Y_LPARAM(msg.lParam); BOOL bOutside; UINT nIndex = ItemFromPoint(CPoint(xPos, yPos), bOutside); if (!bOutside) iReturnItemIdx = (int) nIndex; bBreak = true; } else if (msg.message == WM_KEYDOWN) { // Handle ESCAPE, UP, DOWN and ENTER if (msg.wParam == VK_ESCAPE) bBreak = true; else if (msg.wParam == VK_UP) { int iSel = GetCurSel(); if (iSel == -1 || iSel == 0) SetCurSel(0); else SetCurSel(iSel - 1); } else if (msg.wParam == VK_DOWN) { // Move the selection 1 item down int iSel = GetCurSel(); if (iSel == -1) SetCurSel(0); else if (iSel == GetCount() - 1) { // Do nothing } else SetCurSel(iSel + 1); } else if (msg.wParam == VK_RETURN) { iReturnItemIdx = GetCurSel(); bBreak = true; } } else if (msg.message == WM_LBUTTONDOWN) { // Do nothing } else if (msg.message == WM_MOUSEMOVE) { // Select the item under the mouse cursor int xPos = GET_X_LPARAM(msg.lParam); int yPos = GET_Y_LPARAM(msg.lParam); BOOL bOutside; UINT nIndex = ItemFromPoint(CPoint(xPos, yPos), bOutside); if (!bOutside) SetCurSel((int) nIndex); } else { DispatchMessage(&msg); } } ReleaseCapture(); ShowWindow(SW_HIDE); return iReturnItemIdx; }
LRESULT CArchConsoleWindows::wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CLOSE: ShowWindow(m_frame, FALSE); m_show = false; return 0; case SYNERGY_MSG_CONSOLE_OPEN: return 0; case SYNERGY_MSG_CONSOLE_CLOSE: SendMessage(m_frame, WM_CLOSE, 0, 0); m_show = false; return 0; case SYNERGY_MSG_CONSOLE_SHOW: m_show = true; if (wParam != 0 || !m_buffer.empty()) { ShowWindow(m_frame, TRUE); } return 0; case SYNERGY_MSG_CONSOLE_WRITE: appendBuffer(reinterpret_cast<const char*>(wParam)); return 0; case SYNERGY_MSG_CONSOLE_CLEAR: clearBuffer(); return 0; case WM_SIZE: if (hwnd == m_frame) { MoveWindow(m_hwnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); } break; case WM_SIZING: if (hwnd == m_frame) { // get window vs client area info int wBase = 40 * m_wChar; int hBase = 40 * m_hChar; DWORD style = GetWindowLong(m_frame, GWL_STYLE); DWORD exStyle = GetWindowLong(m_frame, GWL_EXSTYLE); RECT rect; rect.left = 100; rect.top = 100; rect.right = rect.left + wBase; rect.bottom = rect.top + hBase; AdjustWindowRectEx(&rect, style, FALSE, exStyle); wBase = rect.right - rect.left - wBase; hBase = rect.bottom - rect.top - hBase; // get closest size that's a multiple of the character size RECT* newRect = (RECT*)lParam; int width = (newRect->right - newRect->left - wBase) / m_wChar; int height = (newRect->bottom - newRect->top - hBase) / m_hChar; width = width * m_wChar + wBase; height = height * m_hChar + hBase; // adjust sizing rect switch (wParam) { case WMSZ_LEFT: case WMSZ_TOPLEFT: case WMSZ_BOTTOMLEFT: newRect->left = newRect->right - width; break; case WMSZ_RIGHT: case WMSZ_TOPRIGHT: case WMSZ_BOTTOMRIGHT: newRect->right = newRect->left + width; break; } switch (wParam) { case WMSZ_TOP: case WMSZ_TOPLEFT: case WMSZ_TOPRIGHT: newRect->top = newRect->bottom - height; break; case WMSZ_BOTTOM: case WMSZ_BOTTOMLEFT: case WMSZ_BOTTOMRIGHT: newRect->bottom = newRect->top + height; break; } return TRUE; } break; default: break; } return DefWindowProc(hwnd, msg, wParam, lParam); }
BOOL CTreePropSheet::OnInitDialog() { if (m_bTreeViewMode) { // be sure, there are no stacked tabs, because otherwise the // page caption will be to large in tree view mode EnableStackedTabs(FALSE); // Initialize image list. if (m_DefaultImages.GetSafeHandle()) { IMAGEINFO ii; m_DefaultImages.GetImageInfo(0, &ii); if (ii.hbmImage) DeleteObject(ii.hbmImage); if (ii.hbmMask) DeleteObject(ii.hbmMask); m_Images.Create(ii.rcImage.right-ii.rcImage.left, ii.rcImage.bottom-ii.rcImage.top, ILC_COLOR32|ILC_MASK, 0, 1); } else m_Images.Create(16, 16, ILC_COLOR32|ILC_MASK, 0, 1); } // perform default implementation BOOL bResult = CPropertySheet::OnInitDialog(); HighColorTab::UpdateImageList(*this); if (!m_bTreeViewMode) // stop here, if we would like to use tabs return bResult; // Get tab control... CTabCtrl *pTab = GetTabControl(); if (!IsWindow(pTab->GetSafeHwnd())) { ASSERT(FALSE); return bResult; } // ... and hide it pTab->ShowWindow(SW_HIDE); pTab->EnableWindow(FALSE); // Place another (empty) tab ctrl, to get a frame instead CRect rectFrame; pTab->GetWindowRect(rectFrame); ScreenToClient(rectFrame); m_pFrame = CreatePageFrame(); if (!m_pFrame) { ASSERT(FALSE); AfxThrowMemoryException(); } m_pFrame->Create(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, rectFrame, this, 0xFFFF); m_pFrame->ShowCaption(m_bPageCaption); // Lets make place for the tree ctrl const int nTreeWidth = m_nPageTreeWidth; const int nTreeSpace = 5; CRect rectSheet; GetWindowRect(rectSheet); rectSheet.right+= nTreeWidth; SetWindowPos(NULL, -1, -1, rectSheet.Width(), rectSheet.Height(), SWP_NOZORDER|SWP_NOMOVE); CenterWindow(); MoveChildWindows(nTreeWidth, 0); // Lets calculate the rectangle for the tree ctrl CRect rectTree(rectFrame); rectTree.right = rectTree.left + nTreeWidth - nTreeSpace; // calculate caption height CTabCtrl wndTabCtrl; wndTabCtrl.Create(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, rectFrame, this, 0x1234); wndTabCtrl.InsertItem(0, _T("")); CRect rectFrameCaption; wndTabCtrl.GetItemRect(0, rectFrameCaption); wndTabCtrl.DestroyWindow(); m_pFrame->SetCaptionHeight(rectFrameCaption.Height()); // if no caption should be displayed, make the window smaller in // height if (!m_bPageCaption) { // make frame smaller m_pFrame->GetWnd()->GetWindowRect(rectFrame); ScreenToClient(rectFrame); rectFrame.top+= rectFrameCaption.Height(); m_pFrame->GetWnd()->MoveWindow(rectFrame); // move all child windows up MoveChildWindows(0, -rectFrameCaption.Height()); // modify rectangle for the tree ctrl rectTree.bottom-= rectFrameCaption.Height(); // make us smaller CRect rect; GetWindowRect(rect); rect.top+= rectFrameCaption.Height()/2; rect.bottom-= rectFrameCaption.Height()-rectFrameCaption.Height()/2; if (GetParent()) GetParent()->ScreenToClient(rect); MoveWindow(rect); } // finally create the tree control const DWORD dwTreeStyle = TVS_SHOWSELALWAYS|TVS_TRACKSELECT|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS; m_pwndPageTree = CreatePageTreeObject(); if (!m_pwndPageTree) { ASSERT(FALSE); AfxThrowMemoryException(); } // MFC7-support here (Thanks to Rainer Wollgarten) // YT: Cast tree control to CWnd and calls CWnd::CreateEx in all cases (VC 6 and7). ((CWnd*)m_pwndPageTree)->CreateEx( WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY|TVS_EX_DOUBLEBUFFER, _T("SysTreeView32"), _T("PageTree"), WS_TABSTOP|WS_CHILD|WS_VISIBLE|dwTreeStyle, rectTree, this, s_unPageTreeId); if (m_bTreeImages) { m_pwndPageTree->SetImageList(&m_Images, TVSIL_NORMAL); m_pwndPageTree->SetImageList(&m_Images, TVSIL_STATE); } SetWindowTheme(m_pwndPageTree->GetSafeHwnd(), L"Explorer", NULL); // Fill the tree ctrl RefillPageTree(); // Select item for the current page if (pTab->GetCurSel() > -1) SelectPageTreeItem(pTab->GetCurSel()); return bResult; }
// Works out an appropriate size and position of this window void CColorPopup::SetWindowSize() { CSize TextSize; // If we are showing a custom or default text area, get the font and text size. if (m_strCustomText.GetLength() || m_strDefaultText.GetLength()) { CClientDC dc(this); CFont* pOldFont = (CFont*) dc.SelectObject(&m_Font); // Get the size of the custom text (if there IS custom text) TextSize = CSize(0,0); if (m_strCustomText.GetLength()) TextSize = dc.GetTextExtent(m_strCustomText); // Get the size of the default text (if there IS default text) if (m_strDefaultText.GetLength()) { CSize DefaultSize = dc.GetTextExtent(m_strDefaultText); if (DefaultSize.cx > TextSize.cx) TextSize.cx = DefaultSize.cx; if (DefaultSize.cy > TextSize.cy) TextSize.cy = DefaultSize.cy; } dc.SelectObject(pOldFont); TextSize += CSize(2*m_nMargin,2*m_nMargin); // Add even more space to draw the horizontal line TextSize.cy += 2*m_nMargin + 2; } // Get the number of columns and rows //m_nNumColumns = (int) sqrt((double)m_nNumColors); // for a square window (yuk) m_nNumColumns = 8; m_nNumRows = m_nNumColors / m_nNumColumns; if (m_nNumColors % m_nNumColumns) m_nNumRows++; // Get the current window position, and set the new size CRect rect; GetWindowRect(rect); m_WindowRect.SetRect(rect.left, rect.top, rect.left + m_nNumColumns*m_nBoxSize + 2*m_nMargin, rect.top + m_nNumRows*m_nBoxSize + 2*m_nMargin); // if custom text, then expand window if necessary, and set text width as // window width if (m_strDefaultText.GetLength()) { if (TextSize.cx > m_WindowRect.Width()) m_WindowRect.right = m_WindowRect.left + TextSize.cx; TextSize.cx = m_WindowRect.Width()-2*m_nMargin; // Work out the text area m_DefaultTextRect.SetRect(m_nMargin, m_nMargin, m_nMargin+TextSize.cx, 2*m_nMargin+TextSize.cy); m_WindowRect.bottom += m_DefaultTextRect.Height() + 2*m_nMargin; } // if custom text, then expand window if necessary, and set text width as // window width if (m_strCustomText.GetLength()) { if (TextSize.cx > m_WindowRect.Width()) m_WindowRect.right = m_WindowRect.left + TextSize.cx; TextSize.cx = m_WindowRect.Width()-2*m_nMargin; // Work out the text area m_CustomTextRect.SetRect(m_nMargin, m_WindowRect.Height(), m_nMargin+TextSize.cx, m_WindowRect.Height()+m_nMargin+TextSize.cy); m_WindowRect.bottom += m_CustomTextRect.Height() + 2*m_nMargin; } // Need to check it'll fit on screen: Too far right? CSize ScreenSize(::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN)); if (m_WindowRect.right > ScreenSize.cx) m_WindowRect.OffsetRect(-(m_WindowRect.right - ScreenSize.cx), 0); // Too far left? if (m_WindowRect.left < 0) m_WindowRect.OffsetRect( -m_WindowRect.left, 0); // Bottom falling out of screen? if (m_WindowRect.bottom > ScreenSize.cy) { CRect ParentRect; m_pParent->GetWindowRect(ParentRect); m_WindowRect.OffsetRect(0, -(ParentRect.Height() + m_WindowRect.Height())); } // Set the window size and position MoveWindow(m_WindowRect, TRUE); }
static void guiMoveWindow(HWND hwnd, RECT* r) { MoveWindow(hwnd, r->left, r->top, r->right-r->left, r->bottom-r->top, TRUE); }
//--------------------------------------------------------------------------- //WM_INITDIALOG: void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) { HWND hCtrl; //Taskbar and Window icon SendMessage(m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)IcoLib_GetIcon(ICO_PLUG_SSWINDOW1, true)); SendMessage(m_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)IcoLib_GetIcon(ICO_PLUG_SSWINDOW2)); LPTSTR pt = mir_a2t(__PLUGIN_NAME); SetWindowText(m_hWnd, pt); mir_freeAndNil(pt); // Headerbar pt = mir_tstrdup((LPTSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)m_hContact, (LPARAM)GCDNF_TCHAR)); if (pt && (m_hContact != 0)) { LPTSTR lptString = NULL; mir_tcsadd(lptString , TranslateT("Send screenshot to\n")); mir_tcsadd(lptString , pt); SetDlgItemText(m_hWnd, IDC_HEADERBAR, lptString); mir_free(lptString); } mir_freeAndNil(pt); SendMessage(GetDlgItem(m_hWnd, IDC_HEADERBAR), WM_SETICON, 0, (WPARAM)IcoLib_GetIcon(ICO_PLUG_SSWINDOW1, true)); //Timed controls CheckDlgButton(m_hWnd,ID_chkTimed, m_opt_chkTimed ? BST_CHECKED : BST_UNCHECKED); SetDlgItemInt (m_hWnd,ID_edtTimed, (UINT)m_opt_edtTimed, FALSE); SendDlgItemMessage(m_hWnd, ID_upTimed, UDM_SETRANGE, 0, (LPARAM)MAKELONG(250, 1)); chkTimedClick(); //enable disable Timed controls //create Image list for tab control if(m_himlTab == 0) { //m_himlTab = ImageList_Create(16, 16, PluginConfig.m_bIsXP ? ILC_COLOR32 | ILC_MASK : ILC_COLOR8 | ILC_MASK, 2, 0); m_himlTab = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 0); ImageList_AddIcon(m_himlTab, IcoLib_GetIcon(ICO_PLUG_SSWINDOW2)); ImageList_AddIcon(m_himlTab, IcoLib_GetIcon(ICO_PLUG_SSWINDOW2)); } //create the tab control. { TAB_INFO itab; RECT rcClient, rcTab; m_hwndTab = GetDlgItem(m_hWnd, IDC_CAPTURETAB); TabCtrl_SetItemExtra(m_hwndTab, sizeof(TAB_INFO) - sizeof(TCITEMHEADER)); ZeroMemory(&itab, sizeof(itab)); itab.hwndMain = m_hWnd; itab.hwndTab = m_hwndTab; GetWindowRect(m_hwndTab, &rcTab); GetWindowRect(m_hWnd, &rcClient); TabCtrl_SetImageList(m_hwndTab, m_himlTab); // Add a tab for each of the three child dialog boxes. itab.tcih.mask = TCIF_PARAM|TCIF_TEXT|TCIF_IMAGE; itab.tcih.pszText = TranslateT("Window"); itab.tcih.iImage = 0; itab.hwndTabPage = CreateDialog(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureWindow), m_hWnd,DlgProc_CaptureWindow); TabCtrl_InsertItem(m_hwndTab, 0, &itab); MoveWindow(itab.hwndTabPage, (rcTab.left - rcClient.left)+2, (rcTab.top - rcClient.top), (rcTab.right - rcTab.left) - 2*5, (rcTab.bottom - rcTab.top) - 2*20, TRUE); ShowWindow(itab.hwndTabPage, SW_HIDE); CheckDlgButton(itab.hwndTabPage, ID_chkClientArea, m_opt_chkClientArea ? BST_CHECKED : BST_UNCHECKED); itab.tcih.pszText = TranslateT("Desktop"); itab.tcih.iImage = 1; itab.hwndTabPage = CreateDialog(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureDesktop), m_hWnd, DlgProc_CaptureDesktop); TabCtrl_InsertItem(m_hwndTab, 1, &itab); MoveWindow(itab.hwndTabPage, (rcTab.left - rcClient.left)+2, (rcTab.top - rcClient.top), (rcTab.right - rcTab.left) - 2*5, (rcTab.bottom - rcTab.top) - 2*20, TRUE); ShowWindow(itab.hwndTabPage, SW_HIDE); hCtrl = GetDlgItem(itab.hwndTabPage, ID_edtCaption); ComboBox_ResetContent(hCtrl); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("<Entire Desktop>")) ,0); ComboBox_SetCurSel (hCtrl,0); if(m_MonitorCount >1) { TCHAR tszTemp[120]; for (size_t i = 0; i < m_MonitorCount; ++i) { mir_sntprintf(tszTemp, SIZEOF(tszTemp),_T("%i. %s%s"), i+1, TranslateT("Monitor"), (m_Monitors[i].dwFlags & MONITORINFOF_PRIMARY) ? TranslateT(" (primary)") : _T("") ); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, tszTemp) , i+1); } ComboBox_SelectItemData (hCtrl, -1, m_opt_cboxDesktop); //use Workaround for MS bug ComboBox_SelectItemData } PostMessage(m_hWnd, WM_COMMAND, MAKEWPARAM(ID_edtCaption, CBN_SELCHANGE),(LPARAM)hCtrl); //select tab and set m_hwndTabPage TabCtrl_SetCurSel(m_hwndTab, m_opt_tabCapture); ZeroMemory(&itab, sizeof(itab)); itab.tcih.mask = TCIF_PARAM; TabCtrl_GetItem(m_hwndTab,TabCtrl_GetCurSel(m_hwndTab),&itab); ShowWindow(itab.hwndTabPage,SW_SHOW); m_hwndTabPage = itab.hwndTabPage; } //init Format combo box { hCtrl = GetDlgItem(m_hWnd, ID_cboxFormat); ComboBox_ResetContent(hCtrl); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, _T("PNG")),0); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, _T("JPG")),1); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, _T("BMP")),2); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, _T("TIF")),3); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, _T("GIF")),4); ComboBox_SelectItemData (hCtrl, -1, m_opt_cboxFormat); //use Workaround for MS bug ComboBox_SelectItemData } //init SendBy combo box { hCtrl = GetDlgItem(m_hWnd, ID_cboxSendBy); ComboBox_ResetContent(hCtrl); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("<Only save>")) ,SS_JUSTSAVE); if (m_hContact) { ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("File Transfer")),SS_FILESEND); } else if(m_opt_cboxSendBy == SS_FILESEND) { m_opt_cboxSendBy = SS_IMAGESHACK; } ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("E-mail")) ,SS_EMAIL); if (myGlobals.PluginHTTPExist) { ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, _T("HTTP Server")) ,SS_HTTPSERVER); } else if(m_opt_cboxSendBy == SS_HTTPSERVER) { m_opt_cboxSendBy = SS_IMAGESHACK; } if (myGlobals.PluginFTPExist) { ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("FTP File")) ,SS_FTPFILE); } else if(m_opt_cboxSendBy == SS_FTPFILE) { m_opt_cboxSendBy = SS_IMAGESHACK; } ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("ImageShack")) ,(BYTE)SS_IMAGESHACK); ComboBox_SelectItemData (hCtrl, -1, m_opt_cboxSendBy); //use Workaround for MS bug ComboBox_SelectItemData cboxSendByChange(); //enable disable controls } //init footer options CheckDlgButton(m_hWnd,ID_chkOpenAgain, m_opt_chkOpenAgain ? BST_CHECKED : BST_UNCHECKED); if (hCtrl = GetDlgItem(m_hWnd, ID_btnAbout)) { SendDlgItemMessage(m_hWnd, ID_btnAbout, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Information"), MBBF_TCHAR); HICON hIcon = IcoLib_GetIcon(ICO_PLUG_SSHELP); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, hIcon ? _T("") : _T("?")); } if (hCtrl = GetDlgItem(m_hWnd, ID_btnExplore)) { SendDlgItemMessage(m_hWnd, ID_btnExplore, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Open Folder"), MBBF_TCHAR); HICON hIcon = IcoLib_GetIcon(ICO_PLUG_SSFOLDERO); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, hIcon ? _T("") : _T("...")); } if (hCtrl = GetDlgItem(m_hWnd, ID_btnDesc)) { SendDlgItemMessage(m_hWnd, ID_btnDesc, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Fill description textbox."), MBBF_TCHAR); HICON hIcon = IcoLib_GetIcon(m_opt_btnDesc ? ICO_PLUG_SSDESKON : ICO_PLUG_SSDESKOFF); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, hIcon ? _T("") : _T("D")); SendMessage(hCtrl, BM_SETCHECK, m_opt_btnDesc ? BST_CHECKED : BST_UNCHECKED, NULL); } if (hCtrl = GetDlgItem(m_hWnd, ID_btnDeleteAfterSend)) { SendDlgItemMessage(m_hWnd, ID_btnDeleteAfterSend, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Delete after send"), MBBF_TCHAR); HICON hIcon = IcoLib_GetIcon(m_opt_btnDeleteAfterSend ? ICO_PLUG_SSDELON : ICO_PLUG_SSDELOFF); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, hIcon ? _T("") : _T("X")); SendMessage(hCtrl, BM_SETCHECK, m_opt_btnDeleteAfterSend ? BST_CHECKED : BST_UNCHECKED, NULL); } if (hCtrl = GetDlgItem(m_hWnd, ID_btnCapture)) { SendDlgItemMessage(m_hWnd, ID_btnCapture, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Capture"), MBBF_TCHAR); HICON hIcon = IcoLib_GetIcon(ICO_PLUG_OK); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, TranslateT("&Capture")); SendMessage(hCtrl, BUTTONSETDEFAULT, (WPARAM)1, NULL); } // CheckDlgButton(m_hWnd,ID_chkEditor, m_opt_chkEditor ? BST_CHECKED : BST_UNCHECKED); TranslateDialogDefault(m_hWnd); }
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc = NULL; PAINTSTRUCT ps; RECT rect; HFONT fontCorbel, fontText1, fontText2, buttonFont, temp1, temp2; static HWND textArea1, buttonSubmit, buttonClear, textArea2, buttonRed, buttonGreen, buttonBlue; HBRUSH textArea1Brush; static int cxCoord, cyCoord; static HGDIOBJ defaultFont; LRESULT textSize, textSize2; char textStore[1000]; static bool textFlagRed, textFlagBlue, textFlagGreen; static bool backgFlag; static int a, b, c; switch (message) /* handle the messages */ { case WM_CREATE: { textArea1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(" "), WS_VISIBLE | WS_CHILD | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL, 0, 0, 0, 0, hwnd, (HMENU)IDC_TEXT1, GetModuleHandle(NULL), NULL); buttonSubmit = CreateWindowEx(NULL, TEXT("BUTTON"), TEXT("Submit"), WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU)IDC_BUTTON1, GetModuleHandle(NULL), NULL); buttonClear = CreateWindowEx(NULL, TEXT("BUTTON"), TEXT("Clear"), WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU)IDC_BUTTON2, GetModuleHandle(NULL), NULL); textArea2 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(" "), WS_VISIBLE | WS_CHILD | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | ES_READONLY, 0, 0, 0, 0, hwnd, (HMENU)IDC_TEXT1, GetModuleHandle(NULL), NULL); buttonRed = CreateWindowEx(NULL, TEXT("BUTTON"), TEXT("Red"), WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU)IDC_BUTTON3, GetModuleHandle(NULL), NULL); buttonGreen = CreateWindowEx(NULL, TEXT("BUTTON"), TEXT("Green"), WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU)IDC_BUTTON4, GetModuleHandle(NULL), NULL); buttonBlue = CreateWindowEx(NULL, TEXT("BUTTON"), TEXT("Blue"), WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU)IDC_BUTTON5, GetModuleHandle(NULL), NULL); HGDIOBJ defaultFont = GetStockObject(DEFAULT_GUI_FONT); SendMessage(textArea1, WM_SETTEXT, NULL, (LPARAM)"Insert text here... "); SendMessage(buttonSubmit, WM_SETFONT, (WPARAM)defaultFont, MAKELPARAM(FALSE,0)); SendMessage(buttonClear, WM_SETFONT, (WPARAM)defaultFont, MAKELPARAM(FALSE,0)); break; } case WM_PAINT: { hdc = BeginPaint(hwnd, &ps); fontCorbel = CreateFont(20, 0, 0, 0, FW_BOLD, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Corbel"); SetBkMode(hdc, TRANSPARENT); GetClientRect(hwnd, &rect); fontText1 = (HFONT)SelectObject(hdc, fontCorbel); buttonFont = CreateFont(20, 0, 0, 0, FW_DONTCARE, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Consolas"); SendMessage(buttonRed, WM_SETFONT, WPARAM(buttonFont), TRUE); SendMessage(buttonGreen, WM_SETFONT, WPARAM(buttonFont), TRUE); SendMessage(buttonBlue, WM_SETFONT, WPARAM(buttonFont), TRUE); temp2 = CreateFont(14, 0, 0, 0, FW_DONTCARE, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Arial"); temp1 = (HFONT)SelectObject(hdc, temp2); SetTextColor(hdc, RGB(144, 0, 0)); DrawText(hdc, TEXT("Done with Pride and Prejudice by Valeria Bega"), -1, &rect, DT_SINGLELINE| DT_CENTER| DT_TOP); EndPaint(hwnd, &ps); break; } case WM_GETMINMAXINFO: { LPMINMAXINFO winSize = (LPMINMAXINFO)lParam; winSize->ptMinTrackSize.x = 510; winSize->ptMinTrackSize.y = 375; winSize->ptMaxTrackSize.x = 630; winSize->ptMaxTrackSize.y = 425; break; } case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_BUTTON1: { textSize = SendMessage(textArea1, WM_GETTEXT, 100, (LPARAM)textStore); // text size textStore[textSize] = _T('\0'); // initialization with null character SendMessage(textArea2, EM_REPLACESEL, 0, (LPARAM)textStore); // add inputed text to window SendMessage(textArea2, EM_REPLACESEL, 0, (LPARAM)" "); RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ERASE); fontCorbel = CreateFont(20, 0, 0, 0, FW_DONTCARE, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Corbel"); SendMessage(textArea2, WM_SETFONT, (WPARAM)fontCorbel, TRUE); break; } case IDC_BUTTON2: { SendMessage(textArea2, WM_SETTEXT, NULL, NULL); break; } case IDC_BUTTON3: { textFlagRed = true; textFlagBlue = false; textFlagGreen = false; InvalidateRect(textArea2, NULL, TRUE); break; } case IDC_BUTTON4: { textFlagGreen = true; textFlagBlue = false; textFlagRed = false; InvalidateRect(textArea2, NULL, TRUE); break; } case IDC_BUTTON5: { textFlagBlue = true; textFlagRed = false; textFlagGreen = false; InvalidateRect(textArea2, NULL, TRUE); break; } } break; case WM_SYSCOMMAND: { switch(wParam) { case SC_MINIMIZE: { srand(time(NULL)); a = rand() % 255 + 1; b = rand() % 255 + 1; c = rand() % 255 + 1; backgFlag = true; if(backgFlag == true) { SetClassLong(hwnd, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush(RGB(a, b, c))); } InvalidateRect(hwnd, NULL, TRUE); break; } case SC_MAXIMIZE: { double i = 20; while (i < 330) { SetWindowPos(hwnd, HWND_TOP, 411, i,544, 375, SWP_SHOWWINDOW); i = i + 0.1; } while (i > 20) { SetWindowPos(hwnd, HWND_TOP, 411, i,544, 375, SWP_SHOWWINDOW); i = i - 0.1; } break; } case SC_CLOSE: { if(MessageBox(hwnd, "Do you want to close the program?", "Alert", MB_YESNO) == IDYES) { exit(1); } break; } default: return DefWindowProc(hwnd, message, wParam, lParam); } break; case WM_SIZE: { cxCoord = LOWORD(lParam); // 544 cyCoord = HIWORD(lParam); // 375 MoveWindow(textArea1, 20, 45, cxCoord-40, cyCoord/2-97, TRUE); MoveWindow(buttonSubmit, 20, cyCoord/2-40, cxCoord-430, cyCoord/2-144, TRUE); MoveWindow(buttonClear, 411, cyCoord/2-40, cxCoord-430, cyCoord/2-144, TRUE); MoveWindow(textArea2, 20, cyCoord-170, cxCoord-40, cyCoord/2-97, TRUE); MoveWindow(buttonRed, 20, (cyCoord-200) + cyCoord/2-55, cxCoord-425, cyCoord/2-135, TRUE); MoveWindow(buttonBlue, 406, (cyCoord-200) + cyCoord/2-55, cxCoord-425, cyCoord/2-135, TRUE); MoveWindow(buttonGreen, 213, (cyCoord-200) + cyCoord/2-55, cxCoord-425, cyCoord/2-135, TRUE); break; } case WM_CTLCOLOREDIT: { if(IDC_TEXT1 == GetDlgCtrlID((HWND)lParam)) { textArea1Brush = CreateSolidBrush(RGB(198, 226, 255)); SetBkMode((HDC)wParam, TRANSPARENT); return(INT_PTR)textArea1Brush; } break; } case WM_CTLCOLORSTATIC: { if(textFlagRed == true && (HWND)lParam == textArea2) { HBRUSH hbr = (HBRUSH) DefWindowProc(hwnd, message, wParam, lParam); SetTextColor((HDC) wParam, RGB(255, 0, 0)); return (BOOL) hbr; } else if(textFlagBlue == true && (HWND)lParam == textArea2) { HBRUSH hbr = (HBRUSH) DefWindowProc(hwnd, message, wParam, lParam); SetTextColor((HDC) wParam, RGB(0, 0, 255)); return (BOOL) hbr; } else if(textFlagGreen == true && (HWND)lParam == textArea2) { HBRUSH hbr = (HBRUSH) DefWindowProc(hwnd, message, wParam, lParam); SetTextColor((HDC) wParam, RGB(0, 255, 0)); return (BOOL) hbr; } break; } case WM_DESTROY: { PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; } default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } }
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndSmaller, hwndLarger ; static int cxClient, cyClient, cxChar, cyChar ; int cx, cy ; LPDRAWITEMSTRUCT pdis ; POINT pt[3] ; RECT rc ; switch (message) { case WM_CREATE : cxChar = LOWORD (GetDialogBaseUnits ()) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; // Create the owner-draw pushbuttons hwndSmaller = CreateWindow (TEXT ("button"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 0, 0, BTN_WIDTH, BTN_HEIGHT, hwnd, (HMENU) ID_SMALLER, hInst, NULL) ; hwndLarger = CreateWindow (TEXT ("button"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 0, 0, BTN_WIDTH, BTN_HEIGHT, hwnd, (HMENU) ID_LARGER, hInst, NULL) ; return 0 ; case WM_SIZE : cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; // Move the buttons to the new center MoveWindow (hwndSmaller, cxClient / 2 - 3 * BTN_WIDTH / 2, cyClient / 2 - BTN_HEIGHT / 2, BTN_WIDTH, BTN_HEIGHT, TRUE) ; MoveWindow (hwndLarger, cxClient / 2 + BTN_WIDTH / 2, cyClient / 2 - BTN_HEIGHT / 2, BTN_WIDTH, BTN_HEIGHT, TRUE) ; return 0 ; case WM_COMMAND : GetWindowRect (hwnd, &rc) ; // Make the window 10% smaller or larger switch (wParam) { case ID_SMALLER : rc.left += cxClient / 20 ; rc.right -= cxClient / 20 ; rc.top += cyClient / 20 ; rc.bottom -= cyClient / 20 ; break ; case ID_LARGER : rc.left -= cxClient / 20 ; rc.right += cxClient / 20 ; rc.top -= cyClient / 20 ; rc.bottom += cyClient / 20 ; break ; } MoveWindow (hwnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE) ; return 0 ; case WM_DRAWITEM : pdis = (LPDRAWITEMSTRUCT) lParam ; // Fill area with white and frame it black FillRect (pdis->hDC, &pdis->rcItem, (HBRUSH) GetStockObject (WHITE_BRUSH)) ; FrameRect (pdis->hDC, &pdis->rcItem, (HBRUSH) GetStockObject (BLACK_BRUSH)) ; // Draw inward and outward black triangles cx = pdis->rcItem.right - pdis->rcItem.left ; cy = pdis->rcItem.bottom - pdis->rcItem.top ; switch (pdis->CtlID) { case ID_SMALLER : pt[0].x = 3 * cx / 8 ; pt[0].y = 1 * cy / 8 ; pt[1].x = 5 * cx / 8 ; pt[1].y = 1 * cy / 8 ; pt[2].x = 4 * cx / 8 ; pt[2].y = 3 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 7 * cx / 8 ; pt[0].y = 3 * cy / 8 ; pt[1].x = 7 * cx / 8 ; pt[1].y = 5 * cy / 8 ; pt[2].x = 5 * cx / 8 ; pt[2].y = 4 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 5 * cx / 8 ; pt[0].y = 7 * cy / 8 ; pt[1].x = 3 * cx / 8 ; pt[1].y = 7 * cy / 8 ; pt[2].x = 4 * cx / 8 ; pt[2].y = 5 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 1 * cx / 8 ; pt[0].y = 5 * cy / 8 ; pt[1].x = 1 * cx / 8 ; pt[1].y = 3 * cy / 8 ; pt[2].x = 3 * cx / 8 ; pt[2].y = 4 * cy / 8 ; Triangle (pdis->hDC, pt) ; break ; case ID_LARGER : pt[0].x = 5 * cx / 8 ; pt[0].y = 3 * cy / 8 ; pt[1].x = 3 * cx / 8 ; pt[1].y = 3 * cy / 8 ; pt[2].x = 4 * cx / 8 ; pt[2].y = 1 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 5 * cx / 8 ; pt[0].y = 5 * cy / 8 ; pt[1].x = 5 * cx / 8 ; pt[1].y = 3 * cy / 8 ; pt[2].x = 7 * cx / 8 ; pt[2].y = 4 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 3 * cx / 8 ; pt[0].y = 5 * cy / 8 ; pt[1].x = 5 * cx / 8 ; pt[1].y = 5 * cy / 8 ; pt[2].x = 4 * cx / 8 ; pt[2].y = 7 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 3 * cx / 8 ; pt[0].y = 3 * cy / 8 ; pt[1].x = 3 * cx / 8 ; pt[1].y = 5 * cy / 8 ; pt[2].x = 1 * cx / 8 ; pt[2].y = 4 * cy / 8 ; Triangle (pdis->hDC, pt) ; break ; } // Invert the rectangle if the button is selected if (pdis->itemState & ODS_SELECTED) InvertRect (pdis->hDC, &pdis->rcItem) ; // Draw a focus rectangle if the button has the focus if (pdis->itemState & ODS_FOCUS) { pdis->rcItem.left += cx / 16 ; pdis->rcItem.top += cy / 16 ; pdis->rcItem.right -= cx / 16 ; pdis->rcItem.bottom -= cy / 16 ; DrawFocusRect (pdis->hDC, &pdis->rcItem) ; } return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
BOOL CALLBACK ContainerDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { ChatContainer *container; container = (ChatContainer *) GetWindowLong(hwndDlg, GWL_USERDATA); if (container==NULL && msg!=WM_INITDIALOG) return FALSE; switch (msg) { case WM_INITDIALOG: SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM) muccIcon[MUCC_IDI_CHAT]); container = (ChatContainer *) lParam; container->setHWND(hwndDlg); SetWindowLong(hwndDlg, GWL_USERDATA, (LONG) container); ShowWindow(hwndDlg, SW_SHOW); SetEvent(container->getEvent()); return TRUE; case WM_GETMINMAXINFO: MINMAXINFO *mmi; RECT rcChild, rcWindow; mmi = (MINMAXINFO *) lParam; GetWindowRect(hwndDlg, &rcWindow); container->getChildWindowRect(&rcChild); mmi->ptMinTrackSize.x = 380; mmi->ptMinTrackSize.y = 130 + (rcWindow.bottom - rcWindow.top) - (rcChild.bottom - rcChild.top); return FALSE; case WM_SIZE: if (IsIconic(hwndDlg) || wParam == SIZE_MINIMIZED) break; { RECT rc, rcChild, rcWindow; GetClientRect(hwndDlg, &rc); HWND hwndTabs = GetDlgItem(hwndDlg, IDC_TABS); MoveWindow(hwndTabs, 0, 0, (rc.right - rc.left), (rc.bottom - rc.top) - 0, FALSE); RedrawWindow(hwndTabs, NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_ERASE); container->getChildWindowRect(&rcChild); if ((rcChild.bottom-rcChild.top) < 130 || (rcChild.right-rcChild.left) < 380) { GetWindowRect(hwndDlg, &rcWindow); if ((rcChild.bottom-rcChild.top) < 130) { rcWindow.bottom = rcWindow.top + 130 + (rcWindow.bottom - rcWindow.top) - (rcChild.bottom - rcChild.top); } if ((rcChild.right-rcChild.left) < 380) { rcWindow.right = rcWindow.left + 380; } MoveWindow(hwndDlg, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE); container->getChildWindowRect(&rcChild); } if (container->getActive()!=NULL) { MoveWindow(container->getActive()->getHWND(), rcChild.left, rcChild.top, rcChild.right-rcChild.left, rcChild.bottom - rcChild.top, TRUE); } } return TRUE; case DM_CREATECHILD: SetWindowLong(hwndDlg, DWL_MSGRESULT, (LONG)CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_GROUPCHAT_LOG), hwndDlg, (DLGPROC) wParam, (LPARAM) lParam)); return TRUE; case DM_ADDCHILD: container->addChild((ChatWindow *) lParam); return TRUE; case DM_REMOVECHILD: container->removeChild((ChatWindow *) lParam); return TRUE; case DM_CHANGECHILDDATA: container->removeChild((ChatWindow *) lParam); return TRUE; case WM_NOTIFY: { NMHDR* pNMHDR = (NMHDR*) lParam; switch (pNMHDR->code) { case TCN_SELCHANGE: { TCITEM tci = {0}; HWND hwndTabs = GetDlgItem(hwndDlg, IDC_TABS); int iSel = TabCtrl_GetCurSel(hwndTabs); tci.mask = TCIF_PARAM; if (TabCtrl_GetItem(hwndTabs, iSel, &tci)) { ChatWindow * chatWindow = (ChatWindow *) tci.lParam; container->activateChild(chatWindow); } } break; case NM_CLICK: { FILETIME ft; TCHITTESTINFO thinfo; int tabId; HWND hwndTabs = GetDlgItem(hwndDlg, IDC_TABS); GetSystemTimeAsFileTime(&ft); GetCursorPos(&thinfo.pt); ScreenToClient(hwndTabs, &thinfo.pt); tabId = TabCtrl_HitTest(hwndTabs, &thinfo); if (tabId != -1 && tabId == container->lastClickTab && (ft.dwLowDateTime - container->lastClickTime) < (GetDoubleClickTime() * 10000)) { SendMessage(container->getChildFromTab(tabId)->getHWND(), WM_CLOSE, 0, 0); container->lastClickTab = -1; } else { container->lastClickTab = tabId; } container->lastClickTime = ft.dwLowDateTime; } break; } } break; case WM_ACTIVATE: if (LOWORD(wParam) != WA_ACTIVE) break; case WM_MOUSEACTIVATE: if (container->getActive()!=NULL) { SendMessage(container->getActive()->getHWND(), WM_ACTIVATE, WA_ACTIVE, 0); } break; case WM_CLOSE: EndDialog(hwndDlg, 0); return FALSE; case WM_DESTROY: SetWindowLong(hwndDlg, GWL_USERDATA, 0); delete container; return TRUE; } return FALSE; }
//============================================================================== VstPluginExternalEditor::VstPluginExternalEditor (BasePlugin* plugin_, VstPluginWindow* window_) : PluginEditorComponent (plugin_), #if defined(LINUX) eventProc (0), #endif handle (0), window (window_), editorWidth (0), editorHeight (0), offsetX (0), offsetY (0) #ifdef JUCE_MAC && 0 , vstGuiWindow(0) #endif { DBG ("VstPluginExternalEditor::VstPluginExternalEditor"); setWantsKeyboardFocus (true); setVisible (true); #if defined(LINUX) plugin->openEditor (window->getWindowHandle (), display); handle = getChildWindow ((Window) window->getWindowHandle ()); if (handle) eventProc = (EventProcPtr) obtainPropertyFromXWindow (handle, XInternAtom (display, "_XEventProc", false)); #elif defined(_WIN32) plugin->openEditor (window->getWindowHandle (), (void*) 0); handle = GetWindow ((HWND) window->getWindowHandle(), GW_CHILD); #endif if (editorWidth <= 0 || editorHeight <= 0) plugin->getEditorSize (editorWidth, editorHeight); jassert (editorWidth > 0 && editorHeight > 0); setSize (editorWidth, editorHeight); offsetX = window->getBorderThickness().getLeft (); offsetY = window->getTitleBarHeight() + window->getMenuBarHeight() + window->getBorderThickness().getTop (); if (handle) { #if defined(LINUX) XResizeWindow (display, handle, editorWidth, editorHeight); XMoveWindow (display, handle, offsetX, offsetY); #elif defined (_WIN32) MoveWindow (handle, offsetX, offsetY, editorWidth, editorHeight, true); #endif } //#ifdef JUCE_MAC #if 0 setGuiWindow(new MacVSTGUIPositionHelperWindow(plugin, window->getX() + offsetX, window->getY() + offsetY)); showGUI(true); #endif repaint (); startTimer (1000 / 10); }
int Docking_ProcessWindowMessage(WPARAM wParam,LPARAM lParam) { APPBARDATA abd; static int draggingTitle; MSG *msg=(MSG*)wParam; if(msg->message==WM_DESTROY) ModernWriteSettingByte(NULL,"CList","Docked",(BYTE)g_CluiData.fDocked); if(!g_CluiData.fDocked && msg->message!=WM_CREATE && msg->message!=WM_MOVING && msg->message!=WM_CREATEDOCKED && msg->message != WM_MOVE && msg->message != WM_SIZE) return 0; switch(msg->message) { case WM_CREATE: //if(GetSystemMetrics(SM_CMONITORS)>1) return 0; if(ModernGetSettingByte(NULL,"CList","Docked",0) && ModernGetSettingByte(NULL,"CLUI","DockToSides",SETTING_DOCKTOSIDES_DEFAULT)) { PostMessage(msg->hwnd,WM_CREATEDOCKED,0,0); } draggingTitle=0; return 0; case WM_CREATEDOCKED: //we need to post a message just after creation to let main message function do some work g_CluiData.fDocked=(BOOL)ModernGetSettingByte(NULL,"CList","Docked",0); if(IsWindowVisible(msg->hwnd) && !IsIconic(msg->hwnd)) { RECT rc, rcMonitor; ZeroMemory(&abd,sizeof(abd)); abd.cbSize=sizeof(abd); abd.hWnd=msg->hwnd; abd.lParam=0; abd.uCallbackMessage=WM_DOCKCALLBACK; SHAppBarMessage(ABM_NEW,&abd); GetWindowRect(msg->hwnd,&rc); Docking_GetMonitorRectFromWindow(msg->hwnd,&rcMonitor); Docking_AdjustPosition(msg->hwnd,&rcMonitor,&rc); MoveWindow(msg->hwnd,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,TRUE); g_CluiData.mutexPreventDockMoving=0; Sync(CLUIFrames_OnMoving,msg->hwnd,&rc); g_CluiData.mutexPreventDockMoving=1; ModernSkinButton_ReposButtons( msg->hwnd, SBRF_DO_NOT_DRAW, NULL ); } break; case WM_CAPTURECHANGED: ModernSkinButton_ReposButtons(msg->hwnd, SBRF_DO_NOT_DRAW,NULL); return 0; case WM_ACTIVATE: ZeroMemory(&abd,sizeof(abd)); abd.cbSize=sizeof(abd); abd.hWnd=msg->hwnd; SHAppBarMessage(ABM_ACTIVATE,&abd); return 0; case WM_SIZE: ModernSkinButton_ReposButtons( msg->hwnd, SBRF_DO_REDRAW_ALL, NULL ); return 0; case WM_WINDOWPOSCHANGED: { if (g_CluiData.fDocked) ModernSkinButton_ReposButtons( msg->hwnd,SBRF_DO_NOT_DRAW, NULL ); return 0; ZeroMemory(&abd,sizeof(abd)); abd.cbSize=sizeof(abd); abd.hWnd=msg->hwnd; SHAppBarMessage(ABM_WINDOWPOSCHANGED,&abd); ModernSkinButton_ReposButtons( msg->hwnd, SBRF_DO_NOT_DRAW, NULL ); return 0; } case WM_MOVING: { RECT rcMonitor; RECT rcWindow; RECT *rc; int dx=0; POINT ptCursor; if (g_CluiData.fDocked) return 0; // stop early BOOL bControlled = (BOOL)(GetAsyncKeyState(VK_CONTROL)&0x8000); // GetMessagePos() is no good, position is always unsigned GetCursorPos(&ptCursor); GetWindowRect(msg->hwnd,&rcWindow); dock_drag_dx=rcWindow.left-ptCursor.x; dock_drag_dy=rcWindow.top-ptCursor.y; Docking_GetMonitorRectFromPoint(ptCursor,&rcMonitor); if(((ptCursor.x<rcMonitor.left+EDGESENSITIVITY) || (ptCursor.x>=rcMonitor.right-EDGESENSITIVITY)) && ModernGetSettingByte(NULL,"CLUI","DockToSides",SETTING_DOCKTOSIDES_DEFAULT)) { ZeroMemory(&abd,sizeof(abd)); abd.cbSize=sizeof(abd); abd.hWnd=msg->hwnd; abd.lParam=0; abd.uCallbackMessage=WM_DOCKCALLBACK; SHAppBarMessage(ABM_NEW,&abd); if(ptCursor.x<rcMonitor.left+EDGESENSITIVITY) g_CluiData.fDocked=DOCKED_LEFT; else g_CluiData.fDocked=DOCKED_RIGHT; // TempDock=1; GetWindowRect(msg->hwnd,(LPRECT)msg->lParam); rc=(RECT*)msg->lParam; if (g_CluiData.fDocked==DOCKED_RIGHT) dx=(rc->right>rcMonitor.right)?rc->right-rcMonitor.right:0; else dx=(rc->left<rcMonitor.left)?rc->left-rcMonitor.left:0; OffsetRect(rc,-dx,0); Docking_AdjustPosition(msg->hwnd,(LPRECT)&rcMonitor,(LPRECT)msg->lParam); SendMessage(msg->hwnd,WM_SIZE,0,0); g_CluiData.mutexPreventDockMoving=0; Sync(CLUIFrames_OnMoving,msg->hwnd,(LPRECT)msg->lParam); g_CluiData.mutexPreventDockMoving=1; mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); ModernWriteSettingByte(NULL,"CList","Docked",(BYTE)g_CluiData.fDocked); ModernSkinButton_ReposButtons( msg->hwnd, SBRF_DO_NOT_DRAW, NULL ); return TRUE; } return 0; } case WM_EXITSIZEMOVE: { RECT rcMonitor; RECT rcWindow; if (TempDock) TempDock=0; GetWindowRect(msg->hwnd,&rcWindow); Docking_GetMonitorRectFromWindow(msg->hwnd,&rcMonitor); Docking_AdjustPosition(msg->hwnd,&rcMonitor,&rcWindow); *((LRESULT*)lParam)=TRUE; g_CluiData.mutexPreventDockMoving=0; SetWindowPos(msg->hwnd,0,rcWindow.left,rcWindow.top,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOREDRAW|SWP_NOSENDCHANGING); Sync(CLUIFrames_OnMoving,msg->hwnd,&rcWindow); ModernSkinButton_ReposButtons( msg->hwnd, SBRF_DO_NOT_DRAW, NULL );//-=-=-= g_CluiData.mutexPreventDockMoving=1; return 1; } case WM_MOVE: { if(g_CluiData.fDocked && 0) { RECT rc, rcMonitor; Docking_GetMonitorRectFromWindow(msg->hwnd,&rcMonitor); GetWindowRect(msg->hwnd,&rc); Docking_AdjustPosition(msg->hwnd,&rcMonitor,&rc); MoveWindow(msg->hwnd,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,TRUE); Sync(CLUIFrames_OnMoving,msg->hwnd,&rc); ModernSkinButton_ReposButtons(msg->hwnd, SBRF_DO_NOT_DRAW, NULL);//-=-=-= return 1; } ModernSkinButton_ReposButtons(msg->hwnd, SBRF_DO_ALT_DRAW, NULL); return 0; } case WM_SIZING: { /*RECT rcMonitor; Docking_GetMonitorRectFromWindow(msg->hwnd,&rcMonitor); Docking_AdjustPosition(msg->hwnd,&rcMonitor,(LPRECT)msg->lParam); *((LRESULT*)lParam)=TRUE; */ RECT rc; if (g_CluiData.fDocked) ModernSkinButton_ReposButtons(msg->hwnd, SBRF_DO_NOT_DRAW,NULL); return FALSE; rc=*(RECT*)(msg->lParam); g_CluiData.mutexPreventDockMoving=0; Sync(CLUIFrames_OnMoving,msg->hwnd,&rc); //-=-=-= return TRUE; } case WM_SHOWWINDOW: { if(msg->lParam) return 0; BOOL toBeDocked = (BOOL) ModernGetSettingByte(NULL,"CLUI","DockToSides",SETTING_DOCKTOSIDES_DEFAULT); if((msg->wParam && g_CluiData.fDocked<0) || (!msg->wParam && g_CluiData.fDocked>0)) g_CluiData.fDocked=-g_CluiData.fDocked; ZeroMemory(&abd,sizeof(abd)); abd.cbSize=sizeof(abd); abd.hWnd=msg->hwnd; if(msg->wParam) { RECT rc, rcMonitor; Docking_GetMonitorRectFromWindow(msg->hwnd,&rcMonitor); abd.lParam=0; abd.uCallbackMessage=WM_DOCKCALLBACK; SHAppBarMessage(ABM_NEW,&abd); GetWindowRect(msg->hwnd,&rc); Docking_AdjustPosition(msg->hwnd,&rcMonitor,&rc); MoveWindow(msg->hwnd,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,FALSE); Sync(CLUIFrames_OnMoving,msg->hwnd,&rc); ModernSkinButton_ReposButtons(msg->hwnd, SBRF_DO_NOT_DRAW,NULL);//-=-=-= } else { SHAppBarMessage(ABM_REMOVE,&abd); } } return 0; case WM_NCHITTEST: { LONG result; result=DefWindowProc(msg->hwnd,WM_NCHITTEST,msg->wParam,msg->lParam); if(result==HTSIZE || result==HTTOP || result==HTTOPLEFT || result==HTTOPRIGHT || result==HTBOTTOM || result==HTBOTTOMRIGHT || result==HTBOTTOMLEFT) {*((LRESULT*)lParam)=HTCLIENT; return TRUE;} if(g_CluiData.fDocked==DOCKED_LEFT && result==HTLEFT) {*((LRESULT*)lParam)=HTCLIENT; return TRUE;} if(g_CluiData.fDocked==DOCKED_RIGHT && result==HTRIGHT) {*((LRESULT*)lParam)=HTCLIENT; return TRUE;} return 0; } case WM_SYSCOMMAND: if((msg->wParam&0xFFF0)!=SC_MOVE) return 0; SetActiveWindow(msg->hwnd); SetCapture(msg->hwnd); draggingTitle=1; *((LRESULT*)lParam)=0; return TRUE; case WM_MOUSEMOVE: if(!draggingTitle) return 0; { RECT rc; POINT pt; GetClientRect(msg->hwnd,&rc); if(((g_CluiData.fDocked==DOCKED_LEFT || g_CluiData.fDocked==-DOCKED_LEFT) && (short)LOWORD(msg->lParam)>rc.right) || ((g_CluiData.fDocked==DOCKED_RIGHT || g_CluiData.fDocked==-DOCKED_RIGHT) && (short)LOWORD(msg->lParam)<0)) { ReleaseCapture(); draggingTitle=0; ZeroMemory(&abd,sizeof(abd)); abd.cbSize=sizeof(abd); abd.hWnd=msg->hwnd; SHAppBarMessage(ABM_REMOVE,&abd); g_CluiData.fDocked=0; GetCursorPos(&pt); PostMessage(msg->hwnd,WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(pt.x,pt.y)); SetWindowPos(msg->hwnd,0,pt.x-rc.right/2,pt.y-GetSystemMetrics(SM_CYFRAME)-GetSystemMetrics(SM_CYSMCAPTION)/2,ModernGetSettingDword(NULL,"CList","Width",0),ModernGetSettingDword(NULL,"CList","Height",0),SWP_NOZORDER); ModernWriteSettingByte(NULL,"CList","Docked",(BYTE)g_CluiData.fDocked); // ModernSkinButton_ReposButtons(msg->hwnd, SBRF_DO_NOT_DRAW, NULL); } return 1; } case WM_LBUTTONUP: if(draggingTitle) { ReleaseCapture(); draggingTitle=0; } return 0; case WM_DOCKCALLBACK: switch(msg->wParam) { case ABN_WINDOWARRANGE: CLUI_ShowWindowMod(msg->hwnd,msg->lParam?SW_HIDE:SW_SHOW); { RECT rc, rcMonitor; Docking_GetMonitorRectFromWindow(msg->hwnd,&rcMonitor); GetWindowRect(msg->hwnd,&rc); Docking_AdjustPosition(msg->hwnd,&rcMonitor,&rc); Sync(CLUIFrames_OnMoving,msg->hwnd,&rc); //-=-=-= ModernSkinButton_ReposButtons(msg->hwnd, SBRF_DO_NOT_DRAW, NULL); g_CluiData.mutexPreventDockMoving=1; } break; } return TRUE; case WM_DESTROY: if(g_CluiData.fDocked>0) { ZeroMemory(&abd,sizeof(abd)); abd.cbSize=sizeof(abd); abd.hWnd=msg->hwnd; SHAppBarMessage(ABM_REMOVE,&abd); ModernSkinButton_ReposButtons(msg->hwnd, SBRF_DO_NOT_DRAW, NULL); } return 0; } 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; }
LRESULT CALLBACK MixerPlus_MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HMIXER hMixer = NULL; static DWORD dwLines = 0; // Must always count plinfo correctly static PMIXERPLUS_INFO pinfo = NULL; static PMIXERPLUS_LINE_INFO plinfo = NULL; // Array static HWND hCFader = NULL; static DWORD dwControlFlags = 0; static MIXERLINE mxlineDest; static MIXERPLUS_CONTROL_FEED feed; UINT i, j; RECT rcCtrl, rcCFader, rcWnd; SCROLLINFO si; MIXERCAPS mxcaps; MIXERLINE mxlineSrc; MIXERLINECONTROLS mxlctls; MIXERCONTROL mxctl; MIXERCONTROLDETAILS mxcdtls; TCHAR szTitle[MIXERPLUS_MAX_TITLE]; switch(uMsg) { case MM_MIXM_LINE_CHANGE: for(i = 0; i < dwLines; i++) if(((DWORD) lParam) == plinfo[i].dwLineID) { SendMessage(plinfo[i].hCtrl, uMsg, wParam, lParam); return 0; } break; case MM_MIXM_CONTROL_CHANGE: for(i = 0; i < dwLines; i++) { /* Check if child contains control for which this message is intended */ if(((plinfo[i].dwControlFlags & MIXERPLUS_LINE_CONTROL_VOLUME) && ((DWORD) lParam) == plinfo[i].volume.dwID) || ((plinfo[i].dwControlFlags & MIXERPLUS_LINE_CONTROL_MUTE) && ((DWORD) lParam) == plinfo[i].mute.dwID)) { SendMessage(plinfo[i].hCtrl, uMsg, wParam, lParam); return 0; } } if((dwControlFlags & MIXERPLUS_LINE_CONTROL_FEED) && (((DWORD) lParam) == feed.dwID)) { mxlctls.cbStruct = sizeof(mxlctls); mxlctls.cbmxctrl = sizeof(mxctl); mxlctls.dwControlID = feed.dwID; mxlctls.pamxctrl = &mxctl; if(MMERROR(mixerGetLineControls((HMIXEROBJ) hMixer, &mxlctls, MIXER_GETLINECONTROLSF_ONEBYID))) { return 0; } if(feed.dwSources != mxctl.cMultipleItems) { /* Reallocate */ HeapFree(pinfo->hHeap, 0, feed.pmxcdtls_lt); HeapFree(pinfo->hHeap, 0, feed.pmxcdtls_b); feed.pmxcdtls_lt = (LPMIXERCONTROLDETAILS_LISTTEXT) HeapAlloc(pinfo->hHeap, 0, mxctl.cMultipleItems * sizeof(MIXERCONTROLDETAILS_LISTTEXT)); feed.pmxcdtls_b = (LPMIXERCONTROLDETAILS_BOOLEAN) HeapAlloc(pinfo->hHeap, 0, mxctl.cMultipleItems * sizeof(MIXERCONTROLDETAILS_BOOLEAN)); if(!feed.pmxcdtls_lt || !feed.pmxcdtls_b) { dwControlFlags &= ~MIXERPLUS_LINE_CONTROL_FEED; MixerPlus_ErrorBox(hWnd, TEXT("Cannot allocate memory. Check available memory.")); DestroyWindow(hWnd); return 0; } feed.dwSources = mxctl.cMultipleItems; } mxcdtls.cbStruct = sizeof(mxcdtls); mxcdtls.cbDetails = sizeof(MIXERCONTROLDETAILS_LISTTEXT); mxcdtls.dwControlID = feed.dwID; mxcdtls.cMultipleItems = feed.dwSources; mxcdtls.cChannels = 1; mxcdtls.paDetails = feed.pmxcdtls_lt; if(MMERROR(mixerGetControlDetails((HMIXEROBJ) hMixer, &mxcdtls, MIXER_GETCONTROLDETAILSF_LISTTEXT))) { return 0; } mxcdtls.cbStruct = sizeof(mxcdtls); mxcdtls.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN); mxcdtls.dwControlID = feed.dwID; mxcdtls.cMultipleItems = feed.dwSources; mxcdtls.cChannels = 1; mxcdtls.paDetails = feed.pmxcdtls_b; if(MMERROR(mixerGetControlDetails((HMIXEROBJ) hMixer, &mxcdtls, MIXER_GETCONTROLDETAILSF_VALUE))) { return 0; } for(i = 0; i < dwLines; i++) for(j = 0; j < feed.dwSources; j++) if(plinfo[i].dwLineID == feed.pmxcdtls_lt[j].dwParam1) CheckDlgButton(plinfo[i].hCtrl, IDB_POWER, feed.pmxcdtls_b[j].fValue ? BST_CHECKED : BST_UNCHECKED); } break; case WM_HSCROLL: /* Get scroll position */ si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo(hWnd, SB_HORZ, &si); /* Adjust */ switch(LOWORD(wParam)) { case SB_THUMBTRACK: si.nPos = si.nTrackPos; break; case SB_LINELEFT: case SB_PAGELEFT: si.nPos--; break; case SB_LINERIGHT: case SB_PAGERIGHT: si.nPos++; break; case SB_LEFT: si.nPos = si.nMin; break; case SB_RIGHT: si.nPos = si.nMax; break; } SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); /* Allow for adjustments by Windows */ si.cbSize = sizeof(si); si.fMask = SIF_POS; GetScrollInfo(hWnd, SB_HORZ, &si); /* Move child windows */ for(i = 0; i < dwLines; i++) { GetWindowRect(plinfo[i].hCtrl, &rcCtrl); MoveWindow(plinfo[i].hCtrl, (i - si.nPos) * (rcCtrl.right - rcCtrl.left), 0, (rcCtrl.right - rcCtrl.left), (rcCtrl.bottom - rcCtrl.top), TRUE); } return TRUE; case WM_COMMAND: /* Passed from crossfader */ if(LOWORD(wParam) == IDB_FADE && HIWORD(wParam) == BN_CLICKED) { /* Get indices */ i = (DWORD) SendDlgItemMessage(hCFader, IDC_SOURCE, CB_GETCURSEL, 0, 0); j = (DWORD) SendDlgItemMessage(hCFader, IDC_TARGET, CB_GETCURSEL, 0, 0); /* Do nothing if source is target */ if(i == j) return TRUE; /* Start faders */ SendMessage(plinfo[i].hCtrl, WM_COMMAND, MAKEWPARAM(IDB_FADEOUT, BN_CLICKED), (LPARAM) GetDlgItem(plinfo[i].hCtrl, IDB_FADEOUT)); SendMessage(plinfo[j].hCtrl, WM_COMMAND, MAKEWPARAM(IDB_FADEIN, BN_CLICKED), (LPARAM) GetDlgItem(plinfo[j].hCtrl, IDB_FADEIN)); return TRUE; } /* Passed from feed button */ else if((dwControlFlags & MIXERPLUS_LINE_CONTROL_FEED) && LOWORD(wParam) == IDB_POWER && HIWORD(wParam) == BN_CLICKED) { mxcdtls.cbStruct = sizeof(mxcdtls); mxcdtls.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN); mxcdtls.dwControlID = feed.dwID; mxcdtls.cMultipleItems = feed.dwSources; mxcdtls.cChannels = 1; mxcdtls.paDetails = feed.pmxcdtls_b; for(i = 0; i < dwLines; i++) if(((HWND) lParam) == GetDlgItem(plinfo[i].hCtrl, IDB_POWER)) { for(j = 0; j < feed.dwSources; j++) if(plinfo[i].dwLineID == feed.pmxcdtls_lt[j].dwParam1) { ZeroMemory(feed.pmxcdtls_b, feed.dwSources * sizeof(MIXERCONTROLDETAILS_BOOLEAN)); feed.pmxcdtls_b[j].fValue = !(IsDlgButtonChecked(plinfo[i].hCtrl, IDB_POWER) == BST_CHECKED); mixerSetControlDetails((HMIXEROBJ) hMixer, &mxcdtls, MIXER_SETCONTROLDETAILSF_VALUE); return TRUE; } break; } return TRUE; } switch(LOWORD(wParam)) { case ID_FILE_EXIT: SendMessage(hWnd, WM_CLOSE, 0, 0); return 0; case ID_TOOLS_OPTIONS: /* Show options dialog box */ if(DialogBoxParam(pinfo->hInstance, MAKEINTRESOURCE(IDD_OPTIONS), hWnd, (DLGPROC) MixerPlus_OptionsDlgProc, (LPARAM) pinfo) != IDOK) { return TRUE; } /* Destroy everything */ for(i = 0; i < dwLines; i++) DestroyWindow(plinfo[i].hCtrl); if(hCFader) { DestroyWindow(hCFader); hCFader = NULL; } if(dwControlFlags & MIXERPLUS_LINE_CONTROL_FEED) { dwControlFlags &= ~MIXERPLUS_LINE_CONTROL_FEED; HeapFree(pinfo->hHeap, 0, feed.pmxcdtls_lt); HeapFree(pinfo->hHeap, 0, feed.pmxcdtls_b); } if(plinfo) { HeapFree(pinfo->hHeap, 0, plinfo); plinfo = NULL; dwLines = 0; } if(hMixer) { mixerClose(hMixer); hMixer = NULL; } /* Recreate */ SendMessage(hWnd, WM_CREATE, 0, 0); // Do not need to set this since pinfo not NULL return 0; case ID_HELP_ABOUT: MessageBox(hWnd, TEXT("Mixer Plus v0.2\n\nWritten by John Peloquin"), TEXT("Mixer Plus"), MB_ICONINFORMATION); return 0; } break; case WM_CREATE: /* NOTE: This message is also simulated when the user changes options */ /* Get init info if we do not aleady have it */ if(!pinfo) pinfo = (PMIXERPLUS_INFO)(((LPCREATESTRUCT) lParam)->lpCreateParams); /* Open mixer device */ if(MMERROR(mixerOpen(&hMixer, pinfo->dwMixerID, (DWORD_PTR) hWnd, 0, MIXER_OBJECTF_MIXER | CALLBACK_WINDOW))) { MixerPlus_ErrorBox(hWnd, TEXT("Cannot open mixer device.")); return 0; } if(!MMERROR(mixerGetDevCaps((UINT) hMixer, &mxcaps, sizeof(mxcaps)))) { if(SUCCEEDED(StringCchPrintf(szTitle, LENGTHOF(szTitle), TEXT("Mixer Plus [%s - %s]"), mxcaps.szPname, (pinfo->mode == MIXERPLUS_MODE_PLAYBACK) ? TEXT("Playback") : TEXT("Recording")))) { SetWindowText(hWnd, szTitle); } } /* Get mixer destination line info */ mxlineDest.cbStruct = sizeof(mxlineDest); mxlineDest.dwComponentType = (pinfo->mode == MIXERPLUS_MODE_PLAYBACK) ? MIXERLINE_COMPONENTTYPE_DST_SPEAKERS : MIXERLINE_COMPONENTTYPE_DST_WAVEIN; if(MMERROR(mixerGetLineInfo((HMIXEROBJ) hMixer, &mxlineDest, MIXER_GETLINEINFOF_COMPONENTTYPE))) { mixerClose(hMixer); MixerPlus_ErrorBox(hWnd, TEXT("Cannot open mixer destination line.")); return 0; } /* The output destination line also has volume and other controls, so we wish to treat it like a source line. We do not do this for the recording destination line */ dwLines = mxlineDest.cConnections + ((pinfo->mode == MIXERPLUS_MODE_PLAYBACK) ? 1 : 0); /* Allocate info block memory for destination line and its associated source lines */ if(!(plinfo = HeapAlloc(pinfo->hHeap, HEAP_ZERO_MEMORY, // This is necessary! dwLines * sizeof(MIXERPLUS_LINE_INFO)))) { mixerClose(hMixer); MixerPlus_ErrorBox(hWnd, TEXT("Cannot allocate memory. Check available memory.")); return -1; } /* Create crossfader */ if(dwLines > 0) { hCFader = CreateDialog(pinfo->hInstance, MAKEINTRESOURCE(IDD_CROSSFADER), hWnd, (DLGPROC) MixerPlus_CFaderDlgProc); } if(pinfo->mode == MIXERPLUS_MODE_PLAYBACK) { /* Put output destination line info at beginning of array */ i = 0; plinfo[i].mode = pinfo->mode; plinfo[i].hHeap = pinfo->hHeap; plinfo[i].hMixer = hMixer; plinfo[i].dwLineID = mxlineDest.dwLineID; plinfo[i].dwChannels = mxlineDest.cChannels; StringCchCopy(plinfo[i].szName, LENGTHOF(plinfo[i].szName), mxlineDest.szName); /* Add to crossfader lists */ SendDlgItemMessage(hCFader, IDC_SOURCE, CB_ADDSTRING, 0, (LPARAM) plinfo[i].szName); SendDlgItemMessage(hCFader, IDC_TARGET, CB_ADDSTRING, 0, (LPARAM) plinfo[i].szName); /* Create its child window */ if(plinfo[i].hCtrl = CreateDialogParam(pinfo->hInstance, MAKEINTRESOURCE(IDD_MIXERCTRL), hWnd, (DLGPROC) MixerPlus_CtrlDlgProc, (LPARAM) &plinfo[i])) { ShowWindow(plinfo[i].hCtrl, SW_SHOW); } } /* Get ahold of selection control for recording destination line */ else { mxlctls.cbStruct = sizeof(mxlctls); mxlctls.cbmxctrl = sizeof(mxctl); mxlctls.dwLineID = mxlineDest.dwLineID; mxlctls.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX; mxlctls.pamxctrl = &mxctl; if(!MMERROR(mixerGetLineControls((HMIXEROBJ) hMixer, &mxlctls, MIXER_GETLINECONTROLSF_ONEBYTYPE))) { feed.pmxcdtls_lt = (LPMIXERCONTROLDETAILS_LISTTEXT) HeapAlloc(pinfo->hHeap, 0, mxctl.cMultipleItems * sizeof(MIXERCONTROLDETAILS_LISTTEXT)); feed.pmxcdtls_b = (LPMIXERCONTROLDETAILS_BOOLEAN) HeapAlloc(pinfo->hHeap, 0, mxctl.cMultipleItems * sizeof(MIXERCONTROLDETAILS_BOOLEAN)); if(!feed.pmxcdtls_lt || !feed.pmxcdtls_b) { mixerClose(hMixer); MixerPlus_ErrorBox(hWnd, TEXT("Cannot allocate memory. Check available memory.")); return -1; } dwControlFlags |= MIXERPLUS_LINE_CONTROL_FEED; feed.dwID = mxctl.dwControlID; feed.dwSources = mxctl.cMultipleItems; } } /* Get source line info and create child windows */ for(i = 0; i < mxlineDest.cConnections; i++) { j = (pinfo->mode == MIXERPLUS_MODE_PLAYBACK) ? i + 1 : i; mxlineSrc.cbStruct = sizeof(mxlineSrc); mxlineSrc.dwDestination = mxlineDest.dwDestination; mxlineSrc.dwSource = i; mixerGetLineInfo((HMIXEROBJ) hMixer, &mxlineSrc, MIXER_GETLINEINFOF_SOURCE); plinfo[j].mode = pinfo->mode; plinfo[j].hHeap = pinfo->hHeap; plinfo[j].hMixer = hMixer; plinfo[j].dwLineID = mxlineSrc.dwLineID; plinfo[j].dwChannels = mxlineSrc.cChannels; StringCchCopy(plinfo[j].szName, LENGTHOF(plinfo[j].szName), mxlineSrc.szName); /* Add to crossfader lists */ SendDlgItemMessage(hCFader, IDC_SOURCE, CB_ADDSTRING, 0, (LPARAM) plinfo[j].szName); SendDlgItemMessage(hCFader, IDC_TARGET, CB_ADDSTRING, 0, (LPARAM) plinfo[j].szName); if(plinfo[j].hCtrl = CreateDialogParam(pinfo->hInstance, MAKEINTRESOURCE(IDD_MIXERCTRL), hWnd, (DLGPROC) MixerPlus_CtrlDlgProc, (LPARAM) &plinfo[j])) { if(dwControlFlags & MIXERPLUS_LINE_CONTROL_FEED) { SetDlgItemText(plinfo[j].hCtrl, IDB_POWER, TEXT("Feed")); EnableWindow(GetDlgItem(plinfo[j].hCtrl, IDB_POWER), TRUE); } GetWindowRect(plinfo[j].hCtrl, &rcCtrl); MoveWindow(plinfo[j].hCtrl, j * (rcCtrl.right - rcCtrl.left), 0, rcCtrl.right - rcCtrl.left, rcCtrl.bottom - rcCtrl.top, FALSE); ShowWindow(plinfo[j].hCtrl, SW_SHOW); } } /* Adjust window */ if(dwLines > 0 && hCFader) { /* Simulate feed control update if necessary */ if(dwControlFlags & MIXERPLUS_LINE_CONTROL_FEED) SendMessage(hWnd, MM_MIXM_CONTROL_CHANGE, (WPARAM) hMixer, (LPARAM) feed.dwID); /* Initialize crossfader */ SendDlgItemMessage(hCFader, IDC_SOURCE, CB_SETCURSEL, 0, 0); SendDlgItemMessage(hCFader, IDC_TARGET, CB_SETCURSEL, 0, 0); GetWindowRect(hCFader, &rcCFader); MoveWindow(hCFader, 0, rcCtrl.bottom - rcCtrl.top, rcCFader.right - rcCFader.left, rcCFader.bottom - rcCFader.top, FALSE); ShowWindow(hCFader, SW_SHOW); /* Resize main window */ rcWnd.left = 0; rcWnd.top = 0; rcWnd.right = MIXERPLUS_LINES_PER_VIEW * (rcCtrl.right - rcCtrl.left); rcWnd.bottom = (rcCtrl.bottom - rcCtrl.top) + (rcCFader.bottom - rcCFader.top); AdjustWindowRect(&rcWnd, WS_CAPTION, TRUE); rcWnd.bottom += GetSystemMetrics(SM_CYHSCROLL); SetWindowPos(hWnd, HWND_TOP, 0, 0, rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top, SWP_NOMOVE); /* Set scroll range and position */ si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_POS; si.nMin = 0; si.nMax = max(0, dwLines - MIXERPLUS_LINES_PER_VIEW); si.nPos = 0; SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); } return 0; case WM_DESTROY: if(dwControlFlags & MIXERPLUS_LINE_CONTROL_FEED) { HeapFree(pinfo->hHeap, 0, feed.pmxcdtls_lt); HeapFree(pinfo->hHeap, 0, feed.pmxcdtls_b); } /* BUG FIX: intermittent access violation on exit. Do not free plinfo here, as the child windows reference it during their WM_DESTROY processing, occurs after this (see MSDN). This is not a huge leak, as the heap is destroyed immediately after the message loop. */ /* if(plinfo) HeapFree(pinfo->hHeap, 0, plinfo); */ if(hMixer) mixerClose(hMixer); /* Kill message loop */ PostQuitMessage(0); return 0; } /* Pass message to default handler */ return DefWindowProc(hWnd, uMsg, wParam, lParam); }
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); }
BOOL ConfigDialog::DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) #endif { HWND hwndDlgItem; static RenderSystemList* lstRend; RenderSystemList::iterator pRend; static ConfigOptionMap opts; String err; int i, sel, savedSel; switch (iMsg) { case WM_INITDIALOG: // Load saved settings dlg->mSelectedRenderSystem = Root::getSingleton().getRenderSystem(); // Get all render systems lstRend = Root::getSingleton().getAvailableRenderers(); pRend = lstRend->begin(); i = 0; while (pRend != lstRend->end()) { hwndDlgItem = GetDlgItem(hDlg, IDC_CBO_RENDERSYSTEM); SendMessage(hwndDlgItem, CB_ADDSTRING, 0, (LPARAM)(char*)(*pRend)->getName().c_str()); if (*pRend == dlg->mSelectedRenderSystem) { // Select SendMessage(hwndDlgItem, CB_SETCURSEL, (WPARAM)i, 0); // Refresh Options // Get options from render system opts = (*pRend)->getConfigOptions(); // Reset list box hwndDlgItem = GetDlgItem(hDlg, IDC_LST_OPTIONS); //SendMessage(hwndDlgItem, LB_RESETCONTENT, 0, 0); // Iterate through options ConfigOptionMap::iterator pOpt = opts.begin(); String strLine; while( pOpt!= opts.end() ) { strLine = pOpt->second.name + ": " + pOpt->second.currentValue; SendMessage(hwndDlgItem, LB_ADDSTRING, 0, (LPARAM)strLine.c_str()); ++pOpt; } } ++pRend; ++i; } // Center myself int x, y, screenWidth, screenHeight; RECT rcDlg; GetWindowRect(hDlg, &rcDlg); screenWidth = GetSystemMetrics(SM_CXFULLSCREEN); screenHeight = GetSystemMetrics(SM_CYFULLSCREEN); x = (screenWidth / 2) - ((rcDlg.right - rcDlg.left) / 2); y = (screenHeight / 2) - ((rcDlg.bottom - rcDlg.top) / 2); MoveWindow(hDlg, x, y, (rcDlg.right - rcDlg.left), (rcDlg.bottom - rcDlg.top), TRUE); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CBO_RENDERSYSTEM: hwndDlgItem = GetDlgItem(hDlg, IDC_CBO_RENDERSYSTEM); sel = SendMessage( hwndDlgItem, CB_GETCOUNT, 0, 0 ); if (HIWORD(wParam) == CBN_SELCHANGE ) { // RenderSystem selected // Get selected index hwndDlgItem = GetDlgItem(hDlg, IDC_CBO_RENDERSYSTEM); sel = SendMessage(hwndDlgItem, CB_GETCURSEL,0,0); if (sel != -1) { // Get RenderSystem selected pRend = lstRend->begin(); dlg->mSelectedRenderSystem = pRend[sel]; // refresh options // Get options from render system opts = pRend[sel]->getConfigOptions(); // Reset list box hwndDlgItem = GetDlgItem(hDlg, IDC_LST_OPTIONS); SendMessage(hwndDlgItem, LB_RESETCONTENT, 0, 0); // Iterate through options ConfigOptionMap::iterator pOpt = opts.begin(); String strLine; while (pOpt!=opts.end()) { strLine = pOpt->second.name + ": " + pOpt->second.currentValue; SendMessage(hwndDlgItem, LB_ADDSTRING, 0, (LPARAM)strLine.c_str()); ++pOpt; } } } return TRUE; case IDC_LST_OPTIONS: if (HIWORD(wParam) == LBN_SELCHANGE) { // Selection in list box of options changed // Update combo and label in edit section hwndDlgItem = GetDlgItem(hDlg, IDC_LST_OPTIONS); sel = SendMessage(hwndDlgItem, LB_GETCURSEL, 0, 0); if (sel != -1) { ConfigOptionMap::iterator pOpt = opts.begin(); for (i = 0; i < sel; i++) ++pOpt; // Set label text hwndDlgItem = GetDlgItem(hDlg, IDC_LBL_OPTION); SetWindowText(hwndDlgItem, pOpt->second.name.c_str()); // Set combo options hwndDlgItem = GetDlgItem(hDlg, IDC_CBO_OPTION); SendMessage(hwndDlgItem, CB_RESETCONTENT, 0, 0); StringVector::iterator pPoss = pOpt->second.possibleValues.begin(); i = 0; while (pPoss!=pOpt->second.possibleValues.end()) { SendMessage(hwndDlgItem, CB_ADDSTRING, 0, (LPARAM)pPoss[0].c_str()); if (pPoss[0] == pOpt->second.currentValue) // Select current value SendMessage(hwndDlgItem, CB_SETCURSEL, (WPARAM)i, 0); ++pPoss; ++i; } // Enable/disable combo depending on (not)immutable EnableWindow(hwndDlgItem, !(pOpt->second.immutable)); } } return TRUE; case IDC_CBO_OPTION: if (HIWORD(wParam) == CBN_SELCHANGE) { // Updated an option // Get option hwndDlgItem = GetDlgItem(hDlg, IDC_LST_OPTIONS); sel = SendMessage(hwndDlgItem, LB_GETCURSEL, 0, 0); savedSel = sel; ConfigOptionMap::iterator pOpt = opts.begin(); for (i = 0; i < sel; i++) ++pOpt; // Get selected value hwndDlgItem = GetDlgItem(hDlg, IDC_CBO_OPTION); sel = SendMessage(hwndDlgItem, CB_GETCURSEL, 0, 0); if (sel != -1) { StringVector::iterator pPoss = pOpt->second.possibleValues.begin(); // Set option dlg->mSelectedRenderSystem->setConfigOption( pOpt->second.name, pPoss[sel]); // Re-retrieve options opts = dlg->mSelectedRenderSystem->getConfigOptions(); // Reset options list box hwndDlgItem = GetDlgItem(hDlg, IDC_LST_OPTIONS); SendMessage(hwndDlgItem, LB_RESETCONTENT, 0, 0); // Iterate through options pOpt = opts.begin(); String strLine; while (pOpt!=opts.end()) { strLine = pOpt->second.name + ": " + pOpt->second.currentValue; SendMessage(hwndDlgItem, LB_ADDSTRING, 0, (LPARAM)strLine.c_str()); ++pOpt; } // Select previously selected item SendMessage(hwndDlgItem, LB_SETCURSEL, savedSel, 0); } } return TRUE; case IDOK: // Set render system if (!dlg->mSelectedRenderSystem) { MessageBox(NULL, "Please choose a rendering system.", "OGRE", MB_OK | MB_ICONEXCLAMATION); return TRUE; } err = dlg->mSelectedRenderSystem->validateConfigOptions(); if (err.length() > 0) { // refresh options incase updated by validation // Get options from render system opts = dlg->mSelectedRenderSystem->getConfigOptions(); // Reset list box hwndDlgItem = GetDlgItem(hDlg, IDC_LST_OPTIONS); SendMessage(hwndDlgItem, LB_RESETCONTENT, 0, 0); // Iterate through options ConfigOptionMap::iterator pOpt = opts.begin(); String strLine; while (pOpt!=opts.end()) { strLine = pOpt->second.name + ": " + pOpt->second.currentValue; SendMessage(hwndDlgItem, LB_ADDSTRING, 0, (LPARAM)strLine.c_str()); ++pOpt; } MessageBox(NULL, err.c_str(), "OGRE", MB_OK | MB_ICONEXCLAMATION); return TRUE; } Root::getSingleton().setRenderSystem(dlg->mSelectedRenderSystem); EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } } return FALSE; }
BOOL COptionTreeItemEdit::CreateEditItem(DWORD dwOptions, DWORD dwAddStyle) { // Declare variables DWORD dwStyle = WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL; BOOL bRet = FALSE; // Make sure options is not NULL if (m_otOption == NULL) { return FALSE; } // Create edit control if (!IsWindow(GetSafeHwnd())) { // -- Create edit style // -- -- Multiline if (dwOptions & OT_EDIT_MULTILINE) { dwStyle |= ES_MULTILINE; } // -- -- Password if (dwOptions & OT_EDIT_PASSWORD) { dwStyle |= ES_PASSWORD; } // -- -- Numeical if (dwOptions & OT_EDIT_NUMERICAL) { dwStyle |= ES_NUMBER; } // -- -- Additional style if (dwAddStyle != 0) { dwStyle |= dwAddStyle; } // -- Create the edit view bRet = Create(dwStyle, m_rcAttribute, m_otOption->GetCtrlParent(), GetCtrlID()); // -- Setup edit if (bRet == TRUE) { // -- -- Set font SetFont(m_otOption->GetNormalFont(), TRUE); // -- -- Modify style ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_FRAMECHANGED); // -- -- Save options m_dwOptions = dwOptions; // -- -- Set selection SetSel(0, 0); // -- -- Set multiline if (GetOption(OT_EDIT_MULTILINE) == TRUE) { SetItemHeight(OT_EDIT_MLHEIGHT); } // -- -- Set window position MoveWindow(m_rcAttribute.left, m_rcAttribute.top, m_rcAttribute.Width(), m_rcAttribute.Height()); // -- -- Hide window ShowWindow(SW_HIDE); } } return bRet; }
void ToggleFullscreen(HWND hWnd, bool goingFullscreen) { GraphicsContext *graphicsContext = PSP_CoreParameter().graphicsContext; // Make sure no rendering is happening during the switch. if (graphicsContext) { graphicsContext->Pause(); } WINDOWPLACEMENT placement = { sizeof(WINDOWPLACEMENT) }; GetWindowPlacement(hwndMain, &placement); int oldWindowState = g_WindowState; inFullscreenResize = true; g_IgnoreWM_SIZE = true; DWORD dwStyle; if (!goingFullscreen) { dwStyle = ::GetWindowLong(hWnd, GWL_STYLE); // Remove popup dwStyle &= ~WS_POPUP; // Re-add caption and border styles. dwStyle |= WS_OVERLAPPEDWINDOW; // Put back the menu bar. ::SetMenu(hWnd, menu); } else { // If the window was maximized before going fullscreen, make sure to restore first // in order not to have the taskbar show up on top of PPSSPP. if (oldWindowState == SIZE_MAXIMIZED || placement.showCmd == SW_SHOWMAXIMIZED) { ShowWindow(hwndMain, SW_RESTORE); } // Remove caption and border styles. dwStyle = ::GetWindowLong(hWnd, GWL_STYLE); dwStyle &= ~WS_OVERLAPPEDWINDOW; // Add Popup dwStyle |= WS_POPUP; } ::SetWindowLong(hWnd, GWL_STYLE, dwStyle); // Remove the menu bar. This can trigger WM_SIZE ::SetMenu(hWnd, goingFullscreen ? NULL : menu); g_Config.bFullScreen = goingFullscreen; g_IgnoreWM_SIZE = false; // Resize to the appropriate view. // If we're returning to window mode, re-apply the appropriate size setting. if (goingFullscreen) { if (g_Config.bFullScreenMulti) { // Maximize isn't enough to display on all monitors. // Remember that negative coordinates may be valid. int totalX = GetSystemMetrics(SM_XVIRTUALSCREEN); int totalY = GetSystemMetrics(SM_YVIRTUALSCREEN); int totalWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); int totalHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); MoveWindow(hwndMain, totalX, totalY, totalWidth, totalHeight, TRUE); HandleSizeChange(oldWindowState); } else { ShowWindow(hwndMain, SW_MAXIMIZE); } } else { ShowWindow(hwndMain, oldWindowState == SIZE_MAXIMIZED ? SW_MAXIMIZE : SW_RESTORE); if (g_Config.bFullScreenMulti && oldWindowState != SIZE_MAXIMIZED) { // Return the screen to where it was. MoveWindow(hwndMain, g_Config.iWindowX, g_Config.iWindowY, g_Config.iWindowWidth, g_Config.iWindowHeight, TRUE); } if (oldWindowState == SIZE_MAXIMIZED) { // WM_SIZE wasn't sent, since the size didn't change (it was full screen before and after.) HandleSizeChange(oldWindowState); } } inFullscreenResize = false; CorrectCursor(); ShowOwnedPopups(hwndMain, goingFullscreen ? FALSE : TRUE); W32Util::MakeTopMost(hwndMain, g_Config.bTopMost); WindowsRawInput::NotifyMenu(); if (graphicsContext) { graphicsContext->Resume(); } }
void COptionTreeItemEdit::DrawAttribute(CDC *pDC, const RECT &rcRect) { // If we don't have focus, text is drawn. if (m_bFocus == TRUE) { return; } // Make sure options aren't NULL if (m_otOption == NULL) { return; } // Make sure there is a window if (!IsWindow(GetSafeHwnd())) { return; } // Set window position if (IsWindow(GetSafeHwnd())) { MoveWindow(m_rcAttribute.left, m_rcAttribute.top, m_rcAttribute.Width(), m_rcAttribute.Height()); } // Declare variables HGDIOBJ hOld; COLORREF crOld; int nOldBack; CRect rcText; CString strText, strWindowText; COLORREF crOldBack; // Get window text GetWindowText(strWindowText); // Make text // -- Password if (GetOption(OT_EDIT_PASSWORD) == TRUE) { strText = ""; for (int i = 0; i < strWindowText.GetLength(); i++) { strText += _T("*"); } } // -- No password else { strText = strWindowText; } // Select font hOld = pDC->SelectObject(m_otOption->GetNormalFont()); // Set text color if (IsReadOnly() == TRUE || m_otOption->IsWindowEnabled() == FALSE) { crOld = pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT)); } else { crOld = pDC->SetTextColor(GetTextColor()); } // Set background mode nOldBack = pDC->SetBkMode(TRANSPARENT); // Set background color crOldBack = pDC->SetBkColor(GetBackgroundColor()); // Get rectangle rcText = rcRect; // Draw text // -- Single line if (GetOption(OT_EDIT_MULTILINE) == FALSE) { pDC->DrawText(strText, rcText, DT_SINGLELINE | DT_VCENTER); } // -- Mutliline else { pDC->DrawText(strText, rcText, DT_TOP); } // Restore GDI ojects pDC->SelectObject(hOld); pDC->SetTextColor(crOld); pDC->SetBkMode(nOldBack); pDC->SetBkColor(crOldBack); }
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static UINT msgs[] = {BB_RECONFIGURE, BB_REDRAWGUI, BB_BROADCAST, 0}; switch (message) { default: return DefWindowProc (hwnd, message, wParam, lParam); case WM_CREATE: m_hwnd = hwnd; SendMessage(BBhwnd, BB_REGISTERMESSAGE, (WPARAM)hwnd, (LPARAM)msgs); break; case WM_DESTROY: SendMessage(BBhwnd, BB_UNREGISTERMESSAGE, (WPARAM)hwnd, (LPARAM)msgs); break; case BB_BROADCAST: if (0 == memicmp((LPCSTR)lParam, "@BBLeanSkin.", 12)) { const char *msg = (LPCSTR)lParam + 12; if (0 == stricmp(msg, "About")) about_box(); else if (0 == stricmp(msg, "toggleLog")) goto toggle_log; else if (0 == stricmp(msg, "toggleSkin")) { if (engine_running) { write_log("\r\n\t---- stopping engine ----\r\n"); PostMessage(hwnd, bbSkinMsg, MSGID_UNLOAD, 0); PostMessage(hwnd, BB_QUIT, 0, 0); } else { write_log("\r\n\t---- starting engine ----\r\n"); startEngine(); } } } break; case BB_QUIT: stopEngine(); break; case BB_RECONFIGURE: if (is_plugin) // i.e. not loaded by BBWinSkin reconfigureEngine(); break; toggle_log: WriteBool(rcpath, "bbleanskin.option.enableLog:", false == enableLog); reconfigureEngine(); break; //==================== // used in combination with bbstylemaker to update the skin info // and optionally force active or button pressed state. case BB_REDRAWGUI: if (BBRG_WINDOW & wParam) { if (wParam & BBRG_STICKY) { // and to transfer the is_sticky info from bb. PostMessage((HWND)lParam, bbSkinMsg, MSGID_BB_SETSTICKY, 0 != (wParam & BBRG_FOCUS)); break; } static bool prev_opt; int opt = 0; if (prev_opt) opt = MSGID_BBSM_RESET; if (wParam & BBRG_FOCUS) opt = MSGID_BBSM_SETACTIVE; if (wParam & BBRG_PRESSED) opt = MSGID_BBSM_SETPRESSED; prev_opt = opt >= MSGID_BBSM_SETACTIVE; if (opt) setEngineOption(opt); refreshStyle(); } break; //==================== // Log string sent by the engine dll case WM_COPYDATA: { if (201 == ((PCOPYDATASTRUCT)lParam)->dwData) { write_log((char*)((COPYDATASTRUCT*)lParam)->lpData); return TRUE; } break; } //==================== // things for the Log EDIT control case WM_SETFOCUS: if (hwndLog) SetFocus(hwndLog); break; case WM_SIZE: if (hwndLog) MoveWindow(hwndLog, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); break; case WM_CLOSE: if (hwndLog) goto toggle_log; break; } return 0 ; }
void AddSearchTabs(HWND hwnd) { TCITEM tcitem; RECT rect; int i; HWND hwndTab = GetDlgItem(hwnd, IDC_TAB1); tcitem.mask = TCIF_TEXT; tcitem.pszText = _T("Find"); TabCtrl_InsertItem(hwndTab, 0, &tcitem); tcitem.mask = TCIF_TEXT; tcitem.pszText = _T("Replace"); TabCtrl_InsertItem(hwndTab, 1, &tcitem); tcitem.mask = TCIF_TEXT; tcitem.pszText = _T("Goto"); TabCtrl_InsertItem(hwndTab, 2, &tcitem); ///tcitem.mask = TCIF_TEXT; ///tcitem.pszText = _T("Replace"); //TabCtrl_InsertItem(hwndTab, 3, &tcitem); // GetClient // TabCtrl_GetItemRect(hwndTab, 0, &rect); //for(i = MAX_FIND_PANES-1; i >= 0; i--) //{ g_hwndFindPane[0] = CreateDialog(g_hResourceModule, MAKEINTRESOURCE(IDD_FINDPANE), hwnd, FindHexDlg); g_hwndFindPane[1] = CreateDialog(g_hResourceModule, MAKEINTRESOURCE(IDD_REPLACEPANE), hwnd, FindHexDlg); g_hwndFindPane[2] = CreateDialog(g_hResourceModule, MAKEINTRESOURCE(IDD_GOTOPANE), hwnd, FindHexDlg); //ShowWindow(g_hwndFindPane[0], SW_SHOW); //} // work out how big tab control needs to be to hold the pane //for(i = 0; i < MAX_FIND_PANES; i++) i = 0; { GetClientRect(g_hwndFindPane[i], &rect); MapWindowPoints(g_hwndFindPane[i], hwnd, (POINT *)&rect, 2); TabCtrl_AdjustRect(hwndTab, TRUE, &rect); // break; } // move tab control into position MoveWindow(hwndTab, FINDBORDER, FINDBORDER, rect.right-rect.left, rect.bottom-rect.top, FALSE); // adjust the find dialog size AdjustWindowRectEx(&rect, GetWindowLong(hwnd, GWL_STYLE), FALSE, GetWindowLong(hwnd, GWL_EXSTYLE)); InflateRect(&rect, FINDBORDER, FINDBORDER); SetWindowPos(hwnd, 0, 0, 0, rect.right-rect.left, rect.bottom-rect.top-2, SWP_SIZEONLY); // now find out the tab control's client display area GetWindowRect(hwndTab, &rect); MapWindowPoints(0, hwnd, (POINT *)&rect, 2); TabCtrl_AdjustRect(hwndTab, FALSE, &rect); // move find pane into position for(i = 0; i < MAX_FIND_PANES; i++) { MoveWindow(g_hwndFindPane[i], rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, FALSE); } // ShowWindow(g_hwndFindPane[0], SW_SHOW); }
BOOL CALLBACK ConfDialogBoxProc( HWND hWnd, UINT wmes, UINT wparam, LONG lparam ) { int i; switch( wmes ){ case WM_INITDIALOG: CreateMyProp(hWnd); GetClientRect(hWnd, &rect); SendMessage(hWnd, WM_SIZE, 0, MAKELPARAM(rect.right, rect.bottom-40)); break; case WM_SIZE: GetClientRect(hWnd, &rect); rect.bottom -= 40; TabCtrl_AdjustRect(hTabWnd, FALSE, &rect); MoveWindow(hTabWnd, 0, 0, LOWORD(lparam), HIWORD(lparam), TRUE); for(i=0;i<4;i++){ MoveWindow(hPage[i], rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE); } break; case WM_NOTIFY: switch(TabCtrl_GetCurSel(((NMHDR *)lparam)->hwndFrom)) { case 0: ShowWindow(hPage[0], SW_SHOW); ShowWindow(hPage[1], SW_HIDE); ShowWindow(hPage[2], SW_HIDE); break; case 1: ShowWindow(hPage[1], SW_SHOW); ShowWindow(hPage[0], SW_HIDE); ShowWindow(hPage[2], SW_HIDE); break; case 2: ShowWindow(hPage[2], SW_SHOW); ShowWindow(hPage[0], SW_HIDE); ShowWindow(hPage[1], SW_HIDE); break; } break; case WM_COMMAND: switch( LOWORD( wparam ) ){ case IDC_CFGUPDATE: UpdateMyPop(hWnd); break; case IDOK: UpdateMyPop(hWnd); EndDialog( hWnd, IDOK ); break; case IDCANCEL: EndDialog( hWnd, IDCANCEL); break; } break; case WM_CLOSE: EndDialog( hWnd, TRUE ); break; } return 0; } // ConfDialogBoxProc
void DragUI( HWND hWnd, HWND hWnd1,UINT message, WPARAM wParam, LPARAM lParam,BOOL fIsCompWnd) { POINT pt; static POINT ptdif,ptdif1; static RECT drc,drc1; static SIZE sz,sz1; DWORD dwT; switch (message) { case WM_SETCURSOR: if ( HIWORD(lParam) == WM_LBUTTONDOWN || HIWORD(lParam) == WM_RBUTTONDOWN ) { GetCursorPos( &pt ); SetCapture(hWnd); GetWindowRect(hWnd,&drc); ptdif.x = pt.x - drc.left; ptdif.y = pt.y - drc.top; sz.cx = drc.right - drc.left; sz.cy = drc.bottom - drc.top; if (IsWindow(hWnd1)) { GetWindowRect(hWnd1,&drc1); ptdif1.x = pt.x - drc1.left; ptdif1.y = pt.y - drc1.top; sz1.cx = drc1.right - drc1.left; sz1.cy = drc1.bottom - drc1.top; } SetWindowLong(hWnd,FIGWL_MOUSE,FIM_CAPUTURED); } break; case WM_MOUSEMOVE: dwT = GetWindowLong(hWnd,FIGWL_MOUSE); if (dwT & FIM_MOVED) { DrawUIBorder(&drc); if (IsWindow(hWnd1)) DrawUIBorder(&drc1); GetCursorPos( &pt ); drc.left = pt.x - ptdif.x; drc.top = pt.y - ptdif.y; drc.right = drc.left + sz.cx; drc.bottom = drc.top + sz.cy; if (IsWindow(hWnd1)) { drc1.left = pt.x - ptdif1.x; drc1.top = pt.y - ptdif1.y; drc1.right = drc1.left + sz1.cx; drc1.bottom = drc1.top + sz1.cy; } DrawUIBorder(&drc); if (IsWindow(hWnd1)) DrawUIBorder(&drc1); } else if (dwT & FIM_CAPUTURED) { DrawUIBorder(&drc); if (IsWindow(hWnd1)) DrawUIBorder(&drc1); SetWindowLong(hWnd,FIGWL_MOUSE,dwT | FIM_MOVED); } break; case WM_LBUTTONUP: case WM_RBUTTONUP: dwT = GetWindowLong(hWnd,FIGWL_MOUSE); if (dwT & FIM_CAPUTURED) { ReleaseCapture(); if (dwT & FIM_MOVED) { DrawUIBorder(&drc); if (IsWindow(hWnd1)) DrawUIBorder(&drc1); GetCursorPos( &pt ); MoveWindow(hWnd,pt.x - ptdif.x, pt.y - ptdif.y, sz.cx, sz.cy,TRUE); if(fIsCompWnd) { HWND hUIWnd; LPARAM mylParam; *((LPWORD)(&mylParam)) = (WORD)(pt.x - ptdif.x); *((LPWORD)(&mylParam)+1) = (WORD)(pt.y - ptdif.y); hUIWnd = (HWND)GetWindowLong(hWnd,FIGWL_SVRWND); if (IsWindow(hUIWnd)) SendMessage(hUIWnd,WM_UI_COMPMOVE,0,mylParam); } if (IsWindow(hWnd1)) { MoveWindow(hWnd1,pt.x - ptdif1.x, pt.y - ptdif1.y, sz1.cx, sz1.cy,TRUE); } } } break; } }
LRESULT CALLBACK fproc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { if(msg == WMU_TRAYICON) { switch(lp) { case WM_LBUTTONUP: ShowWindow(hwnd, SW_SHOW); SetForegroundWindow(hwnd); break; case WM_RBUTTONUP: POINT point; GetCursorPos(&point); switch(TrackPopupMenu(g_menu, TPM_RETURNCMD | TPM_NONOTIFY, point.x, point.y, 0, hwnd, NULL)) { case ID_MENU_INSTALL: hook_install_(); break; case ID_MENU_UNINSTALL: hook_uninstall_(); break; case ID_MENU_HIDE: Shell_NotifyIcon(NIM_DELETE, &g_idata); break; case ID_MENU_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break; } break; } return 0; } switch(msg) { case WM_CREATE: g_hwndEdit = CreateWindow("edit", "", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_READONLY, 0, 0, 0, 0, hwnd, NULL, (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL ); SendMessage(g_hwndEdit, WM_SETFONT, (WPARAM)GetStockObject(SYSTEM_FIXED_FONT), 0); SendMessage(g_hwndEdit, EM_LIMITTEXT, 1024 * 1024 * 1024, 0); break; case WM_SIZE: MoveWindow(g_hwndEdit, 0, 0, LOWORD(lp), HIWORD(lp), TRUE); break; case WM_SYSCOMMAND: switch(wp & 0xFFF0) { case SC_MINIMIZE: Shell_NotifyIcon(NIM_ADD, &g_idata); ShowWindow(hwnd, SW_HIDE); return 0; break; } break; case WM_CLOSE: break; case WM_DESTROY: PostQuitMessage(0); break; case WM_COPYDATA: // if(IsWindowVisible(hwnd)) { PCOPYDATASTRUCT data = (PCOPYDATASTRUCT)lp; int n = GetWindowTextLength(g_hwndEdit); SendMessage(g_hwndEdit, EM_SETSEL, n, n); SendMessage(g_hwndEdit, EM_REPLACESEL, 0, (LPARAM)data->lpData); } break; } return DefWindowProc(hwnd, msg, wp, lp); }
/* ================ rvGENavigator::WndProc Window Procedure ================ */ LRESULT CALLBACK rvGENavigator::WndProc ( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { rvGENavigator* nav = (rvGENavigator*) GetWindowLong ( hWnd, GWL_USERDATA ); switch ( msg ) { case WM_INITMENUPOPUP: return SendMessage ( gApp.GetMDIFrame ( ), msg, wParam, lParam ); case WM_ACTIVATE: common->ActivateTool( LOWORD( wParam ) != WA_INACTIVE ); break; case WM_ERASEBKGND: return TRUE; case WM_DESTROY: gApp.GetOptions().SetWindowPlacement ( "navigator", hWnd ); break; case WM_CLOSE: gApp.GetOptions().SetNavigatorVisible ( false ); nav->Show ( false ); return 0; case WM_DRAWITEM: { DRAWITEMSTRUCT* dis = (DRAWITEMSTRUCT*) lParam; idWindow* window = (idWindow*)dis->itemData; if ( window ) { rvGEWindowWrapper* wrapper = rvGEWindowWrapper::GetWrapper ( window ); idStr name = window->GetName(); RECT rDraw; float offset; bool disabled; idWindow* parent = window; offset = 1; disabled = false; while ( parent = parent->GetParent ( ) ) { if ( rvGEWindowWrapper::GetWrapper ( parent )->IsHidden ( ) ) { disabled = true; } offset += 10; } CopyRect ( &rDraw, &dis->rcItem ); rDraw.right = rDraw.left + GENAV_ITEMHEIGHT; rDraw.top ++; rDraw.right ++; FrameRect ( dis->hDC, &rDraw, (HBRUSH)GetStockObject ( BLACK_BRUSH ) ); rDraw.right --; FillRect ( dis->hDC, &rDraw, GetSysColorBrush ( COLOR_3DFACE ) ); Draw3dRect ( dis->hDC, &rDraw, GetSysColorBrush ( COLOR_3DHILIGHT ), GetSysColorBrush ( COLOR_3DSHADOW ) ); InflateRect ( &rDraw, -3, -3 ); Draw3dRect ( dis->hDC, &rDraw, GetSysColorBrush ( COLOR_3DSHADOW ), GetSysColorBrush ( COLOR_3DHILIGHT ) ); if ( !wrapper->IsHidden ( ) ) { DrawIconEx ( dis->hDC, rDraw.left, rDraw.top, disabled?nav->mVisibleIconDisabled:nav->mVisibleIcon, 16, 16,0, NULL, DI_NORMAL ); } CopyRect ( &rDraw, &dis->rcItem ); rDraw.left += GENAV_ITEMHEIGHT; rDraw.left += 1; if ( dis->itemState & ODS_SELECTED ) { FillRect ( dis->hDC, &rDraw, GetSysColorBrush ( COLOR_HIGHLIGHT ) ); } else { FillRect ( dis->hDC, &rDraw, GetSysColorBrush ( COLOR_WINDOW ) ); } if ( wrapper->CanHaveChildren ( ) && window->GetChildCount ( ) ) { if ( wrapper->IsExpanded ( ) ) { DrawIconEx ( dis->hDC, rDraw.left + offset, rDraw.top + 3, nav->mCollapseIcon, 16, 16,0, NULL, DI_NORMAL ); } else { DrawIconEx ( dis->hDC, rDraw.left + offset, rDraw.top + 3, nav->mExpandIcon, 16, 16,0, NULL, DI_NORMAL ); } } HPEN pen = CreatePen ( PS_SOLID, 1, GetSysColor ( COLOR_3DSHADOW ) ); HPEN oldpen = (HPEN)SelectObject ( dis->hDC, pen ); MoveToEx ( dis->hDC, rDraw.left, dis->rcItem.top, NULL ); LineTo ( dis->hDC, dis->rcItem.right, dis->rcItem.top ); MoveToEx ( dis->hDC, rDraw.left, dis->rcItem.bottom, NULL ); LineTo ( dis->hDC, dis->rcItem.right, dis->rcItem.bottom); SelectObject ( dis->hDC, oldpen ); DeleteObject ( pen ); rDraw.left += offset; rDraw.left += 20; int colorIndex = ( (dis->itemState & ODS_SELECTED ) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT ); SetTextColor ( dis->hDC, GetSysColor ( colorIndex ) ); DrawText ( dis->hDC, name, name.Length(), &rDraw, DT_LEFT|DT_VCENTER|DT_SINGLELINE ); if ( wrapper->GetVariableDict().GetNumKeyVals ( ) || wrapper->GetScriptDict().GetNumKeyVals ( ) ) { DrawIconEx ( dis->hDC, dis->rcItem.right - 16, (dis->rcItem.bottom+dis->rcItem.top)/2-6, (dis->itemState & ODS_SELECTED)?nav->mScriptsLightIcon:nav->mScriptsIcon, 13, 13,0, NULL, DI_NORMAL ); } } break; } case WM_MEASUREITEM: { MEASUREITEMSTRUCT* mis = (MEASUREITEMSTRUCT*) lParam; mis->itemHeight = 22; break; } case WM_CREATE: { LPCREATESTRUCT cs; LVCOLUMN col; // Attach the class to the window first cs = (LPCREATESTRUCT) lParam; nav = (rvGENavigator*) cs->lpCreateParams; SetWindowLong ( hWnd, GWL_USERDATA, (LONG)nav ); // Create the List view nav->mTree = CreateWindowEx ( 0, "SysListView32", "", WS_VSCROLL|WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_OWNERDRAWFIXED|LVS_NOCOLUMNHEADER|LVS_SHOWSELALWAYS, 0, 0, 0, 0, hWnd, (HMENU)IDC_GUIED_WINDOWTREE, win32.hInstance, 0 ); ListView_SetExtendedListViewStyle ( nav->mTree, LVS_EX_FULLROWSELECT ); ListView_SetBkColor ( nav->mTree, GetSysColor ( COLOR_3DFACE ) ); ListView_SetTextBkColor ( nav->mTree, GetSysColor ( COLOR_3DFACE ) ); nav->mListWndProc = (WNDPROC)GetWindowLong ( nav->mTree, GWL_WNDPROC ); SetWindowLong ( nav->mTree, GWL_USERDATA, (LONG)nav ); SetWindowLong ( nav->mTree, GWL_WNDPROC, (LONG)ListWndProc ); // Insert the only column col.mask = 0; ListView_InsertColumn ( nav->mTree, 0, &col ); break; } case WM_SIZE: { RECT rClient; MoveWindow ( nav->mTree, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE ); GetClientRect ( nav->mTree, &rClient ); ListView_SetColumnWidth ( nav->mTree, 0, rClient.right-rClient.left-1 ); break; } case WM_NCACTIVATE: return gApp.ToolWindowActivate ( gApp.GetMDIFrame(), msg, wParam, lParam ); case WM_NOTIFY: { LPNMHDR nh; nh = (LPNMHDR) lParam; switch ( nh->code ) { case NM_CLICK: case NM_DBLCLK: { DWORD dwpos = GetMessagePos(); LVHITTESTINFO info; info.pt.x = LOWORD(dwpos); info.pt.y = HIWORD(dwpos); MapWindowPoints(HWND_DESKTOP, nh->hwndFrom, &info.pt, 1); int index = ListView_HitTest ( nav->mTree, &info ); if ( index != -1 ) { RECT rItem; int offset; ListView_GetItemRect ( nav->mTree, index, &rItem, LVIR_BOUNDS ); LVITEM item; item.mask = LVIF_PARAM; item.iItem = index; ListView_GetItem ( nav->mTree, &item ); idWindow* window = (idWindow*)item.lParam; rvGEWindowWrapper* wrapper = rvGEWindowWrapper::GetWrapper(window); offset = wrapper->GetDepth ( ) * 10 + 1; if ( info.pt.x < GENAV_ITEMHEIGHT ) { if ( !rvGEWindowWrapper::GetWrapper(window)->IsHidden ( ) ) { nav->mWorkspace->HideWindow ( window ); } else { nav->mWorkspace->UnhideWindow ( window ); } } else if ( info.pt.x > GENAV_ITEMHEIGHT + offset && info.pt.x < GENAV_ITEMHEIGHT + offset + 16 ) { if ( wrapper->CanHaveChildren ( ) && window->GetChildCount ( ) ) { if ( wrapper->IsExpanded ( ) ) { wrapper->Collapse ( ); nav->Update ( ); } else { wrapper->Expand ( ); nav->Update ( ); } } } else if ( nh->code == NM_DBLCLK ) { SendMessage ( gApp.GetMDIFrame ( ), WM_COMMAND, MAKELONG(ID_GUIED_ITEM_PROPERTIES,0), 0 ); } } break; } case NM_RCLICK: { DWORD dwpos = GetMessagePos(); LVHITTESTINFO info; info.pt.x = LOWORD(dwpos); info.pt.y = HIWORD(dwpos); MapWindowPoints(HWND_DESKTOP, nh->hwndFrom, &info.pt, 1); int index = ListView_HitTest ( nav->mTree, &info ); if ( index != -1 ) { ClientToScreen ( hWnd, &info.pt ); HMENU menu = GetSubMenu ( LoadMenu ( gApp.GetInstance(), MAKEINTRESOURCE(IDR_GUIED_ITEM_POPUP) ), 0 ); TrackPopupMenu ( menu, TPM_RIGHTBUTTON|TPM_LEFTALIGN, info.pt.x, info.pt.y, 0, gApp.GetMDIFrame ( ), NULL ); DestroyMenu ( menu ); } break; } case LVN_ITEMCHANGED: { NMLISTVIEW* nml = (NMLISTVIEW*) nh; if ( (nml->uNewState & LVIS_SELECTED) != (nml->uOldState & LVIS_SELECTED) ) { LVITEM item; item.iItem = nml->iItem; item.mask = LVIF_PARAM; ListView_GetItem ( nav->mTree, &item ); if ( nml->uNewState & LVIS_SELECTED ) { nav->mWorkspace->GetSelectionMgr().Add ( (idWindow*)item.lParam, false ); } else { nav->mWorkspace->GetSelectionMgr().Remove ( (idWindow*)item.lParam ); } } break; } } break; } } return DefWindowProc ( hWnd, msg, wParam, lParam ); }
bool CALLBACK CNewMap::_newMapProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; int pow; switch(iMessage) { case WM_INITDIALOG: int x, y, w, h; RECT parentRect, dlgRect; newMap->m_hWnd = hDlg; GetWindowRect(newMap->m_parentHandle, &parentRect); GetClientRect(hDlg, &dlgRect); x = parentRect.left + (parentRect.right - parentRect.left) / 2 - (dlgRect.right - dlgRect.left) / 2; y = parentRect.top+100; w = dlgRect.right - dlgRect.left; h = dlgRect.bottom - dlgRect.top; MoveWindow(hDlg, x, y, w, h, true); newMap->_Init(); return 0; case WM_CLOSE: newMap->_btCancel(hDlg); return false; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_BT_CANCEL: newMap->_btCancel(hDlg); break; case IDC_BT_CREATE: newMap->_btCreate(hDlg); break; case IDC_RADIO_CELL_4: case IDC_RADIO_CELL_8: case IDC_RADIO_CELL_16: pow = LOWORD(wParam) - IDC_RADIO_CELL_4 + 2; newMap->_calcCell(pow); break; case IDC_RADIO_TILE_8: case IDC_RADIO_TILE_16: case IDC_RADIO_TILE_32: pow = LOWORD(wParam) - IDC_RADIO_TILE_8 + 3; newMap->_calcTile(pow); break; case IDC_LIST_NEW_TEXTURE: newMap->_SelListBox(LOWORD(wParam), HIWORD(wParam)); break; } break; case WM_HSCROLL: newMap->_SlideBar(reinterpret_cast<HWND>(lParam)); break; case WM_PAINT: hdc = BeginPaint(hDlg, &ps); newMap->m_preview.Render(); EndPaint(hDlg, &ps); break; } return false; }
/* ============ CameraWndProc ============ */ LONG WINAPI WCam_WndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { int fwKeys, xPos, yPos; RECT rect; GetClientRect(hWnd, &rect); switch (uMsg) { case WM_CREATE: { HFONT hfont; g_qeglobals.d_hdcBase = GetDC(hWnd); QEW_SetupPixelFormat(g_qeglobals.d_hdcBase, true); if ( ( g_qeglobals.d_hglrcBase = wglCreateContext( g_qeglobals.d_hdcBase ) ) == 0 ) Error ("wglCreateContext failed"); if (!wglMakeCurrent( g_qeglobals.d_hdcBase, g_qeglobals.d_hglrcBase )) Error ("wglMakeCurrent failed"); Texture_SetMode(g_qeglobals.d_savedinfo.iTexMenu); // // create GL font // hfont = CreateFont( 10, // logical height of font 7, // logical average character width 0, // angle of escapement 0, // base-line orientation angle 0, // font weight 0, // italic attribute flag 0, // underline attribute flag 0, // strikeout attribute flag 0, // character set identifier 0, // output precision 0, // clipping precision 0, // output quality 0, // pitch and family 0 // pointer to typeface name string ); if ( !hfont ) Error( "couldn't create font" ); SelectObject (g_qeglobals.d_hdcBase, hfont); if ( ( g_qeglobals.d_font_list = glGenLists (256) ) == 0 ) Error( "couldn't create font dlists" ); // create the bitmap display lists // we're making images of glyphs 0 thru 255 if ( !wglUseFontBitmaps (g_qeglobals.d_hdcBase, 1, 255, g_qeglobals.d_font_list) ) Error( "wglUseFontBitmaps faileD" ); // indicate start of glyph display lists glListBase (g_qeglobals.d_font_list); // report OpenGL information Sys_Printf ("GL_VENDOR: %s\n", glGetString (GL_VENDOR)); Sys_Printf ("GL_RENDERER: %s\n", glGetString (GL_RENDERER)); Sys_Printf ("GL_VERSION: %s\n", glGetString (GL_VERSION)); Sys_Printf ("GL_EXTENSIONS: %s\n", glGetString (GL_EXTENSIONS)); } return 0; case WM_PAINT: { PAINTSTRUCT ps; if (!wglMakeCurrent( g_qeglobals.d_hdcBase, g_qeglobals.d_hglrcBase )) Error ("wglMakeCurrent failed"); if ( BeginPaint(hWnd, &ps) ) { QE_CheckOpenGLForErrors(); Cam_Draw (); QE_CheckOpenGLForErrors(); EndPaint(hWnd, &ps); SwapBuffers(g_qeglobals.d_hdcBase); } } return 0; case WM_USER+267: // benchmark { PAINTSTRUCT ps; WINDOWPLACEMENT wp; double start, end; int i; memset( &wp, 0, sizeof( wp ) ); wp.length = sizeof( wp ); GetWindowPlacement( g_qeglobals.d_hwndCamera, &wp ); MoveWindow( g_qeglobals.d_hwndCamera, 30, 30, 400, 400, TRUE ); BeginPaint(hWnd, &ps); if (!wglMakeCurrent( g_qeglobals.d_hdcBase, g_qeglobals.d_hglrcBase)) Error ("wglMakeCurrent failed"); glDrawBuffer (GL_FRONT); start = Sys_DoubleTime (); for (i=0 ; i<100 ; i++) { camera.angles[YAW] = i*4; Cam_Draw (); } wglSwapBuffers(g_qeglobals.d_hdcBase); glDrawBuffer (GL_BACK); end = Sys_DoubleTime (); EndPaint(hWnd, &ps); Sys_Printf ("%5.2f seconds\n", end-start); SetWindowPlacement( g_qeglobals.d_hwndCamera, &wp ); } break; case WM_KEYDOWN: if ( QE_KeyDown (wParam) ) return 0; else return DefWindowProc( hWnd, uMsg, wParam, lParam ); case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONDOWN: if (GetTopWindow(g_qeglobals.d_hwndMain) != hWnd) BringWindowToTop(hWnd); SetFocus (g_qeglobals.d_hwndCamera); SetCapture (g_qeglobals.d_hwndCamera); fwKeys = wParam; // key flags xPos = (short)LOWORD(lParam); // horizontal position of cursor yPos = (short)HIWORD(lParam); // vertical position of cursor yPos = (int)rect.bottom - 1 - yPos; Cam_MouseDown (xPos, yPos, fwKeys); return 0; case WM_MBUTTONUP: case WM_RBUTTONUP: case WM_LBUTTONUP: fwKeys = wParam; // key flags xPos = (short)LOWORD(lParam); // horizontal position of cursor yPos = (short)HIWORD(lParam); // vertical position of cursor yPos = (int)rect.bottom - 1 - yPos; Cam_MouseUp (xPos, yPos, fwKeys); if (! (fwKeys & (MK_LBUTTON|MK_RBUTTON|MK_MBUTTON))) ReleaseCapture (); return 0; case WM_MOUSEMOVE: fwKeys = wParam; // key flags xPos = (short)LOWORD(lParam); // horizontal position of cursor yPos = (short)HIWORD(lParam); // vertical position of cursor yPos = (int)rect.bottom - 1 - yPos; Cam_MouseMoved (xPos, yPos, fwKeys); return 0; case WM_SIZE: camera.width = rect.right; camera.height = rect.bottom; InvalidateRect(g_qeglobals.d_hwndCamera, NULL, false); return 0; case WM_KILLFOCUS: case WM_SETFOCUS: SendMessage( hWnd, WM_NCACTIVATE, uMsg == WM_SETFOCUS, 0 ); return 0; case WM_NCCALCSIZE:// don't let windows copy pixels DefWindowProc (hWnd, uMsg, wParam, lParam); return WVR_REDRAW; case WM_CLOSE: DestroyWindow (hWnd); return 0; case WM_DESTROY: QEW_StopGL( hWnd, g_qeglobals.d_hglrcBase, g_qeglobals.d_hdcBase ); return 0; } return DefWindowProc( hWnd, uMsg, wParam, lParam ); }