/****************************************************************** * WDML_CreateServerConv * * */ static WDML_CONV* WDML_CreateServerConv(WDML_INSTANCE* pInstance, HWND hwndClient, HWND hwndServerName, HSZ hszApp, HSZ hszTopic) { HWND hwndServerConv; WDML_CONV* pConv; if (pInstance->unicode) { WNDCLASSEXW wndclass; wndclass.cbSize = sizeof(wndclass); wndclass.style = 0; wndclass.lpfnWndProc = WDML_ServerConvProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 2 * sizeof(ULONG_PTR); wndclass.hInstance = 0; wndclass.hIcon = 0; wndclass.hCursor = 0; wndclass.hbrBackground = 0; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = WDML_szServerConvClassW; wndclass.hIconSm = 0; RegisterClassExW(&wndclass); hwndServerConv = CreateWindowW(WDML_szServerConvClassW, 0, WS_CHILD, 0, 0, 0, 0, hwndServerName, 0, 0, 0); } else { WNDCLASSEXA wndclass; wndclass.cbSize = sizeof(wndclass); wndclass.style = 0; wndclass.lpfnWndProc = WDML_ServerConvProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 2 * sizeof(ULONG_PTR); wndclass.hInstance = 0; wndclass.hIcon = 0; wndclass.hCursor = 0; wndclass.hbrBackground = 0; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = WDML_szServerConvClassA; wndclass.hIconSm = 0; RegisterClassExA(&wndclass); hwndServerConv = CreateWindowA(WDML_szServerConvClassA, 0, WS_CHILD, 0, 0, 0, 0, hwndServerName, 0, 0, 0); } TRACE("Created convServer=%p (nameServer=%p) for instance=%08x unicode=%d\n", hwndServerConv, hwndServerName, pInstance->instanceID, pInstance->unicode); pConv = WDML_AddConv(pInstance, WDML_SERVER_SIDE, hszApp, hszTopic, hwndClient, hwndServerConv); if (pConv) { SetWindowLongPtrW(hwndServerConv, GWL_WDML_INSTANCE, (ULONG_PTR)pInstance); SetWindowLongPtrW(hwndServerConv, GWL_WDML_CONVERSATION, (ULONG_PTR)pConv); /* this should be the only place using SendMessage for WM_DDE_ACK */ /* note: sent messages shall not use packing */ SendMessageW(hwndClient, WM_DDE_ACK, (WPARAM)hwndServerConv, MAKELPARAM(WDML_MakeAtomFromHsz(hszApp), WDML_MakeAtomFromHsz(hszTopic))); /* we assume we're connected since we've sent an answer... * I'm not sure what we can do... it doesn't look like the return value * of SendMessage is used... sigh... */ pConv->wStatus |= ST_CONNECTED; } else { DestroyWindow(hwndServerConv); } return pConv; }
static VOID CreateNTPServerList(HWND hwnd) { HWND hList; WCHAR szValName[MAX_VALUE_NAME]; WCHAR szData[256]; DWORD dwIndex = 0; DWORD dwValSize; DWORD dwNameSize; DWORD dwDefault = 1; LONG lRet; HKEY hKey; hList = GetDlgItem(hwnd, IDC_SERVERLIST); lRet = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\DateTime\\Servers", 0, KEY_QUERY_VALUE, &hKey); if (lRet != ERROR_SUCCESS) return; while (TRUE) { dwValSize = MAX_VALUE_NAME * sizeof(WCHAR); szValName[0] = L'\0'; lRet = RegEnumValueW(hKey, dwIndex, szValName, &dwValSize, NULL, NULL, (LPBYTE)szData, &dwNameSize); if (lRet == ERROR_SUCCESS) { /* Get date from default reg value */ if (wcscmp(szValName, L"") == 0) // if (Index == 0) { dwDefault = _wtoi(szData); dwIndex++; } else { SendMessageW(hList, CB_ADDSTRING, 0, (LPARAM)szData); dwIndex++; } } else if (lRet != ERROR_MORE_DATA) { break; } } if (dwDefault < 1 || dwDefault > dwIndex) dwDefault = 1; /* Server reg entries count from 1, * Combo boxes count from 0 */ dwDefault--; SendMessageW(hList, CB_SETCURSEL, dwDefault, 0); RegCloseKey(hKey); }
static LRESULT CALLBACK tableWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { struct table *t; HDC dc; PAINTSTRUCT ps; NMHDR *nmhdr = (NMHDR *) lParam; NMHEADERW *nm = (NMHEADERW *) lParam; t = (struct table *) GetWindowLongPtrW(hwnd, GWLP_USERDATA); if (t == NULL) { // we have to do things this way because creating the header control will fail mysteriously if we create it first thing // (which is fine; we can get the parent hInstance this way too) if (uMsg == WM_NCCREATE) { CREATESTRUCTW *cs = (CREATESTRUCTW *) lParam; t = (struct table *) malloc(sizeof (struct table)); if (t == NULL) abort(); ZeroMemory(t, sizeof (struct table)); t->hwnd = hwnd; // TODO this should be a global t->defaultFont = (HFONT) GetStockObject(SYSTEM_FONT); if (t->defaultFont == NULL) abort(); t->font = t->defaultFont; t->selected = 5;t->count=100;//TODO t->header = CreateWindowExW(0, WC_HEADERW, L"", // TODO is HOTTRACK needed? WS_CHILD | HDS_FULLDRAG | HDS_HORZ | HDS_HOTTRACK, 0, 0, 0, 0, t->hwnd, (HMENU) 100, cs->hInstance, NULL); if (t->header == NULL) abort(); {t->imagelist = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32, 1, 1); if(t->imagelist==NULL)abort(); { HICON icon; int unused; icon = LoadIconW(NULL, IDI_ERROR); if(icon == NULL)abort(); if (ImageList_AddIcon(t->imagelist, icon) == -1)abort(); if (ImageList_GetIconSize(t->imagelist, &unused, &(t->imagelistHeight)) == 0)abort(); } } t->checkboxes = makeCheckboxImageList(t->hwnd, &(t->theme), &(t->checkboxWidth), &(t->checkboxHeight)); t->focusedColumn = -1; SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR) t); } // even if we did the above, fall through return DefWindowProcW(hwnd, uMsg, wParam, lParam); } switch (uMsg) { case WM_PAINT: dc = BeginPaint(hwnd, &ps); if (dc == NULL) abort(); drawItems(t, dc, ps.rcPaint); EndPaint(hwnd, &ps); return 0; case WM_SETFONT: t->font = (HFONT) wParam; if (t->font == NULL) t->font = t->defaultFont; // also set the header font SendMessageW(t->header, WM_SETFONT, wParam, lParam); if (LOWORD(lParam) != FALSE) { // the scrollbar page size will change so redraw that too // also recalculate the header height // TODO do that when this is FALSE too somehow resize(t); redrawAll(t); } return 0; case WM_GETFONT: return (LRESULT) t->font; case WM_VSCROLL: vscroll(t, wParam); return 0; case WM_MOUSEWHEEL: wheelscroll(t, wParam); return 0; case WM_HSCROLL: hscroll(t, wParam); return 0; case WM_SIZE: resize(t); return 0; case WM_LBUTTONDOWN: selectItem(t, wParam, lParam); return 0; case WM_SETFOCUS: case WM_KILLFOCUS: // all we need to do here is redraw the highlight // TODO ensure giving focus works right redrawRow(t, t->selected); return 0; case WM_KEYDOWN: keySelect(t, wParam, lParam); return 0; // TODO header double-click case WM_NOTIFY: if (nmhdr->hwndFrom == t->header) switch (nmhdr->code) { // I could use HDN_TRACK but wine doesn't emit that case HDN_ITEMCHANGING: case HDN_ITEMCHANGED: // TODO needed? recomputeHScroll(t); redrawAll(t); return FALSE; } return DefWindowProcW(hwnd, uMsg, wParam, lParam); // TODO others? case WM_WININICHANGE: case WM_SYSCOLORCHANGE: case WM_THEMECHANGED: if (ImageList_Destroy(t->checkboxes) == 0) abort(); t->checkboxes = makeCheckboxImageList(t->hwnd, &(t->theme), &(t->checkboxWidth), &(t->checkboxHeight)); resize(t); // TODO needed? redrawAll(t); // now defer back to DefWindowProc() in case other things are needed // TODO needed? return DefWindowProcW(hwnd, uMsg, wParam, lParam); case tableAddColumn: addColumn(t, wParam, lParam); return 0; case WM_GETOBJECT: // accessibility /* if (((DWORD) lParam) == OBJID_CLIENT) { TODO *server; LRESULT lResult; // TODO create the server object lResult = LresultFromObject(IID_IAccessible, wParam, server); if (/* TODO failure *|/) abort(); // TODO release object return lResult; } */ return DefWindowProcW(hwnd, uMsg, wParam, lParam); default: return DefWindowProcW(hwnd, uMsg, wParam, lParam); } abort(); return 0; // unreached }
static INT_PTR CALLBACK icm_choose_compressor_dlgproc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) { case WM_INITDIALOG: { struct codec_info *ic; WCHAR buf[128]; struct choose_compressor *choose_comp = (struct choose_compressor *)lparam; SetWindowLongPtrW(hdlg, DWLP_USER, lparam); /* FIXME */ choose_comp->flags &= ~(ICMF_CHOOSE_DATARATE | ICMF_CHOOSE_KEYFRAME); if (choose_comp->title) SetWindowTextA(hdlg, choose_comp->title); if (!(choose_comp->flags & ICMF_CHOOSE_DATARATE)) { ShowWindow(GetDlgItem(hdlg, IDC_DATARATE_CHECKBOX), SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_DATARATE), SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_DATARATE_KB), SW_HIDE); } if (!(choose_comp->flags & ICMF_CHOOSE_KEYFRAME)) { ShowWindow(GetDlgItem(hdlg, IDC_KEYFRAME_CHECKBOX), SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_KEYFRAME), SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_KEYFRAME_FRAMES), SW_HIDE); } /* FIXME */ EnableWindow(GetDlgItem(hdlg, IDC_QUALITY_SCROLL), FALSE); EnableWindow(GetDlgItem(hdlg, IDC_QUALITY_TXT), FALSE); /*if (!(choose_comp->flags & ICMF_CHOOSE_PREVIEW)) ShowWindow(GetDlgItem(hdlg, IDC_PREVIEW), SW_HIDE);*/ LoadStringW(MSVFW32_hModule, IDS_FULLFRAMES, buf, 128); SendDlgItemMessageW(hdlg, IDC_COMP_LIST, CB_ADDSTRING, 0, (LPARAM)buf); ic = HeapAlloc(GetProcessHeap(), 0, sizeof(struct codec_info)); ic->icinfo.fccType = streamtypeVIDEO; ic->icinfo.fccHandler = comptypeDIB; ic->hic = 0; SendDlgItemMessageW(hdlg, IDC_COMP_LIST, CB_SETITEMDATA, 0, (LPARAM)ic); enum_compressors(GetDlgItem(hdlg, IDC_COMP_LIST), &choose_comp->cv, choose_comp->flags & ICMF_CHOOSE_ALLCOMPRESSORS); SendDlgItemMessageW(hdlg, IDC_COMP_LIST, CB_SETCURSEL, 0, 0); SetFocus(GetDlgItem(hdlg, IDC_COMP_LIST)); SetWindowLongPtrW(hdlg, DWLP_USER, (ULONG_PTR)choose_comp); break; } case WM_COMMAND: switch (LOWORD(wparam)) { case IDC_COMP_LIST: { INT cur_sel; struct codec_info *ic; BOOL can_configure = FALSE, can_about = FALSE; struct choose_compressor *choose_comp; if (HIWORD(wparam) != CBN_SELCHANGE && HIWORD(wparam) != CBN_SETFOCUS) break; choose_comp = (struct choose_compressor *)GetWindowLongPtrW(hdlg, DWLP_USER); cur_sel = SendMessageW((HWND)lparam, CB_GETCURSEL, 0, 0); ic = (struct codec_info *)SendMessageW((HWND)lparam, CB_GETITEMDATA, cur_sel, 0); if (ic && ic->hic) { if (ICQueryConfigure(ic->hic) == DRVCNF_OK) can_configure = TRUE; if (ICQueryAbout(ic->hic) == DRVCNF_OK) can_about = TRUE; } EnableWindow(GetDlgItem(hdlg, IDC_CONFIGURE), can_configure); EnableWindow(GetDlgItem(hdlg, IDC_ABOUT), can_about); if (choose_comp->flags & ICMF_CHOOSE_DATARATE) { /* FIXME */ } if (choose_comp->flags & ICMF_CHOOSE_KEYFRAME) { /* FIXME */ } break; } case IDC_CONFIGURE: case IDC_ABOUT: { HWND list = GetDlgItem(hdlg, IDC_COMP_LIST); INT cur_sel; struct codec_info *ic; if (HIWORD(wparam) != BN_CLICKED) break; cur_sel = SendMessageW(list, CB_GETCURSEL, 0, 0); ic = (struct codec_info *)SendMessageW(list, CB_GETITEMDATA, cur_sel, 0); if (ic && ic->hic) { if (LOWORD(wparam) == IDC_CONFIGURE) ICConfigure(ic->hic, hdlg); else ICAbout(ic->hic, hdlg); } break; } case IDOK: { HWND list = GetDlgItem(hdlg, IDC_COMP_LIST); INT cur_sel; struct codec_info *ic; if (HIWORD(wparam) != BN_CLICKED) break; cur_sel = SendMessageW(list, CB_GETCURSEL, 0, 0); ic = (struct codec_info *)SendMessageW(list, CB_GETITEMDATA, cur_sel, 0); if (ic) { struct choose_compressor *choose_comp = (struct choose_compressor *)GetWindowLongPtrW(hdlg, DWLP_USER); choose_comp->cv.hic = ic->hic; choose_comp->cv.fccType = ic->icinfo.fccType; choose_comp->cv.fccHandler = ic->icinfo.fccHandler; /* FIXME: fill everything else */ /* prevent closing the codec handle below */ ic->hic = 0; } } /* fall through */ case IDCANCEL: { HWND list = GetDlgItem(hdlg, IDC_COMP_LIST); INT idx = 0; if (HIWORD(wparam) != BN_CLICKED) break; while (1) { struct codec_info *ic; ic = (struct codec_info *)SendMessageW(list, CB_GETITEMDATA, idx++, 0); if (!ic || (LONG_PTR)ic == CB_ERR) break; if (ic->hic) ICClose(ic->hic); HeapFree(GetProcessHeap(), 0, ic); } EndDialog(hdlg, LOWORD(wparam) == IDOK); break; } default: break; } break; default: break; } return FALSE; }
void uiSpinboxSetValue(uiSpinbox *s, int value) { s->inhibitChanged = TRUE; SendMessageW(s->updown, UDM_SETPOS32, 0, (LPARAM) value); s->inhibitChanged = FALSE; }
void initDialog( HWND hwnd ) { addComboItems( GetDlgItem( hwnd, IDC_COMBOLANGUAGE ), manager.getOptionNames( "Language" ), manager.getTheOneInUse( "Language" ) ); addComboItems( GetDlgItem( hwnd, IDC_COMBORESOLUTION ), manager.getOptionNames( "Resolution" ), manager.getTheOneInUse( "Resolution" ) ); addComboItems( GetDlgItem( hwnd, IDC_COMBOGFXDETAIL ), manager.getOptionNames( "GraphicsDetail" ), manager.getTheOneInUse( "GraphicsDetail" ) ); addComboItems( GetDlgItem( hwnd, IDC_COMBOSPEAKERTYPE ), manager.getOptionNames( "SpeakerType" ), manager.getTheOneInUse( "SpeakerType" ) ); addComboItems( GetDlgItem( hwnd, IDC_COMBOMIXINGRATE ), manager.getOptionNames( "MixingRate" ), manager.getTheOneInUse( "MixingRate" ) ); addComboItems( GetDlgItem( hwnd, IDC_COMBOPHYSICSDETAIL ), manager.getOptionNames( "Physics Quality" ), manager.getTheOneInUse( "Physics Quality" ) ); addComboItems( GetDlgItem( hwnd, IDC_COMBOCONTROLTYPE ), manager.getOptionNames( "ClawControlType" ), manager.getTheOneInUse( "ClawControlType" ) ); // IDC_COMBOCONTROLTYPE setCheckBox( hwnd, IDC_CHECKSOUND, manager.getTheOneInUse( "Sounds" ) ); setCheckBox( hwnd, IDC_CHECKHARDWARE3D, manager.getTheOneInUse( "Hardware3D" ) ); setCheckBox( hwnd, IDC_CHECKENABLEMENUVIDEO, manager.getTheOneInUse( "EnableMenuVideo" ) ); setCheckBox( hwnd, IDC_CHECKENABLEMENUVSYNC, manager.getTheOneInUse( "VSync" ) ); setCheckBox( hwnd, IDC_CHECKEAX, manager.getTheOneInUse( "Eax" ) ); //SendMessage( hwnd, CB_ADDSTRING, 0, ( LPARAM ) game::getLocaleGuiString( items[ i ].c_str() ) ); //SendMessage( hwnd, CB_SELECTSTRING, -1, ( LPARAM )game::getLocaleGuiString( select.c_str() ) ); // Mod stuff setDescriptionText( GetDlgItem( hwnd, IDC_MOD_HELP ) ); setDescriptionText( GetDlgItem( hwnd, IDC_LAUNCHER_MOD_SELECTION ) ); { SendMessage( GetDlgItem( hwnd, IDC_COMBOMODSELECTION ), CB_RESETCONTENT, 0, 0); #ifdef FB_RU_HAX std::wstring nomod = ::game::DHLocaleManager::getInstance()->getWideString(::game::DHLocaleManager::BANK_GUI, "launcher_no_mod"); SendMessageW( GetDlgItem( hwnd, IDC_COMBOMODSELECTION ), CB_ADDSTRING, (WPARAM)0, (LPARAM) nomod.c_str() ); #else std::string nomod = game::getLocaleGuiString("launcher_no_mod"); SendMessage( GetDlgItem( hwnd, IDC_COMBOMODSELECTION ), CB_ADDSTRING, 0, ( LPARAM ) nomod.c_str()); #endif for(int i = 0; i < modSelector.getModAmount(); ++i) { const std::string &desc = modSelector.getDescription(i); SendMessage( GetDlgItem( hwnd, IDC_COMBOMODSELECTION ), CB_ADDSTRING, 0, ( LPARAM ) desc.c_str()); } int selection = modSelector.getActiveIndex(); SendMessage( GetDlgItem( hwnd, IDC_COMBOMODSELECTION ), CB_SETCURSEL, selection + 1, 0); /* if(selection >= 0) SendMessage( GetDlgItem( hwnd, IDC_COMBOMODSELECTION ), CB_SETCURSEL, selection + 1, 0); else SendMessage( GetDlgItem( hwnd, IDC_COMBOMODSELECTION ), CB_SETCURSEL, 0, 0); */ /* const std::string root = "Mods"; filesystem::StandardPackage files; filesystem::FileList fileList; files.findFiles(root, "*.zip", fileList); modList.clear(); modStringList.clear(); for(int i = 0; i < fileList.getFileAmount(root); ++i) { const std::string &zipFullName = fileList.getFileName(root, i); std::string zipName; int index = zipFullName.find_first_of("/\\"); if(index != zipFullName.npos) zipName = zipFullName.substr(index + 1, zipFullName.size() - index - 1); filesystem::ZipPackage zip(zipFullName); filesystem::InputStream stream = zip.getFile("description.txt"); if(stream.isEof()) continue; editor::Parser parser; stream >> parser; const editor::ParserGroup &group = parser.getGlobals(); if(group.getLineCount() < 1) continue; std::string name = group.getLine(0); if(name.size() < 4) continue; modList[name] = zipName; modStringList.push_back(name); } std::sort(modStringList.begin(), modStringList.end()); // FIXME -- get key from locales SendMessage( GetDlgItem( hwnd, IDC_COMBOMODSELECTION ), CB_ADDSTRING, 0, ( LPARAM ) "Nothing. Zip. Nada"); for(unsigned int i = 0; i < modStringList.size(); ++i) SendMessage( GetDlgItem( hwnd, IDC_COMBOMODSELECTION ), CB_ADDSTRING, 0, ( LPARAM ) modStringList[i].c_str()); //if no mod selected SendMessage( GetDlgItem( hwnd, IDC_COMBOMODSELECTION ), CB_SETCURSEL, 0, 0); */ } // Editor things setDescriptionText( GetDlgItem( hwnd, IDC_EDITOR_HELP ) ); setDescriptionText( GetDlgItem( hwnd, IDC_LAUNCHER_EDITOR ) ); setDescriptionText( GetDlgItem( hwnd, IDC_EDITOR_MANUAL ) ); setDescriptionText( GetDlgItem( hwnd, IDC_EDITOR_LAUNCH ) ); // buttons setDescriptionText( GetDlgItem( hwnd, IDOK ) ); setDescriptionText( GetDlgItem( hwnd, IDCANCEL ) ); setDescriptionText( GetDlgItem( hwnd, IDC_BUTTONADVANCED ) ); setDescriptionText( GetDlgItem( hwnd, IDCHECKUPDATES ) ); setDescriptionText( GetDlgItem( hwnd, IDC_ACTIVATEMOD ) ); // language setDescriptionText( GetDlgItem( hwnd, IDC_CAPTION1 ) ); setDescriptionText( GetDlgItem( hwnd, IDC_CAPTION6 ) ); // graphics detail setDescriptionText( GetDlgItem( hwnd, IDC_STATICGRAPHICSLEVEL ) ); setDescriptionText( GetDlgItem( hwnd, IDC_CAPTION2 ) ); setDescriptionText( GetDlgItem( hwnd, IDC_CAPTION3 ) ); setDescriptionText( GetDlgItem( hwnd, IDC_CHECKENABLEMENUVIDEO ) ); setDescriptionText( GetDlgItem( hwnd, IDC_CHECKENABLEMENUVSYNC ) ); // physics setDescriptionText( GetDlgItem( hwnd, IDC_STATICPHYSICSLEVEL ) ); setDescriptionText( GetDlgItem( hwnd, IDC_AGEIAPROPAGANDA ) ); // sounds setDescriptionText( GetDlgItem( hwnd, IDC_STATICSOUNDS ) ); setDescriptionText( GetDlgItem( hwnd, IDC_CHECKSOUND ) ); setDescriptionText( GetDlgItem( hwnd, IDC_CHECKHARDWARE3D ) ); setDescriptionText( GetDlgItem( hwnd, IDC_CAPTION4 ) ); setDescriptionText( GetDlgItem( hwnd, IDC_CAPTION5 ) ); setDescriptionText( GetDlgItem( hwnd, IDC_CHECKEAX ) ); }
HRESULT STDMETHODCALLTYPE CBandSiteBase::AddBand(IUnknown *punk) { LONG NewAllocated; struct BandObject *NewBand = NULL; CComPtr<IDeskBand> DeskBand; CComPtr<IObjectWithSite> ObjWithSite; CComPtr<IOleWindow> OleWindow; CComPtr<IWinEventHandler> WndEvtHandler; REBARBANDINFOW rbi; HRESULT hRet; UINT uBand; TRACE("(%p, %p)\n", this, punk); if (punk == NULL || fRebarWindow == NULL) return E_FAIL; hRet = punk->QueryInterface(IID_PPV_ARG(IDeskBand, &DeskBand)); if (!SUCCEEDED(hRet) || DeskBand == NULL) goto Cleanup; hRet = punk->QueryInterface(IID_PPV_ARG(IObjectWithSite, &ObjWithSite)); if (!SUCCEEDED(hRet) || ObjWithSite == NULL) goto Cleanup; hRet = punk->QueryInterface(IID_PPV_ARG(IOleWindow, &OleWindow)); if (!SUCCEEDED(hRet) || OleWindow == NULL) goto Cleanup; hRet = punk->QueryInterface(IID_PPV_ARG(IWinEventHandler, &WndEvtHandler)); if (!SUCCEEDED(hRet) || WndEvtHandler == NULL) goto Cleanup; hRet = S_OK; if (fBandsAllocated > fBandsCount) { /* Search for a free band object */ for (INT i = 0; i < fBandsAllocated; i++) { if (fBands[i].DeskBand == NULL) { NewBand = &fBands[i]; break; } } } else if (fBandsAllocated > 0) { ASSERT (fBands != NULL); /* Reallocate the band object array */ NewAllocated = fBandsAllocated + 8; if (NewAllocated > 0xFFFF) NewAllocated = 0xFFFF; if (NewAllocated == fBandsAllocated) { hRet = E_OUTOFMEMORY; goto Cleanup; } NewBand = static_cast<struct BandObject *>(CoTaskMemAlloc(NewAllocated * sizeof(struct BandObject))); if (NewBand == NULL) { hRet = E_OUTOFMEMORY; goto Cleanup; } /* Copy the old array */ memcpy(NewBand, fBands, fBandsAllocated * sizeof(struct BandObject)); /* Initialize the added bands */ memset(&NewBand[fBandsAllocated], 0, (NewAllocated - fBandsAllocated) * sizeof(struct BandObject)); fBandsAllocated = NewAllocated; CoTaskMemFree(fBands); fBands = NewBand; } else { ASSERT(fBands == NULL); ASSERT(fBandsAllocated == 0); ASSERT(fBandsCount == 0); /* Allocate new array */ fBands = static_cast<struct BandObject *>(CoTaskMemAlloc(8 * sizeof(struct BandObject))); if (fBands == NULL) { hRet = E_OUTOFMEMORY; goto Cleanup; } /* Initialize the added bands */ memset(fBands, 0, 8 * sizeof(struct BandObject)); fBandsAllocated += 8; NewBand = &fBands[0]; } if (SUCCEEDED(hRet)) { ASSERT(NewBand != NULL); fBandsCount++; NewBand->DeskBand = DeskBand.Detach(); NewBand->OleWindow = OleWindow.Detach(); NewBand->WndEvtHandler = WndEvtHandler.Detach(); /* Create the ReBar band */ hRet = ObjWithSite->SetSite(static_cast<IOleWindow *>(this)); if (SUCCEEDED(hRet)) { uBand = 0xffffffff; if (SUCCEEDED(UpdateSingleBand(NewBand))) { if (NewBand->dbi.dwMask & DBIM_MODEFLAGS) { if (NewBand->dbi.dwModeFlags & DBIMF_ADDTOFRONT) uBand = 0; } } BuildRebarBandInfo(NewBand, &rbi); if (SUCCEEDED(NewBand->OleWindow->GetWindow(&rbi.hwndChild)) && rbi.hwndChild != NULL) { rbi.fMask |= RBBIM_CHILD; WARN ("ReBar band uses child window 0x%p\n", rbi.hwndChild); } if (!SendMessageW(fRebarWindow, RB_INSERTBANDW, (WPARAM)uBand, reinterpret_cast<LPARAM>(&rbi))) return E_FAIL; hRet = (HRESULT)((USHORT)GetBandID(NewBand)); } else { WARN("IBandSite::AddBand(): Call to IDeskBand::SetSite() failed: %x\n", hRet); /* Remove the band from the ReBar control */ BuildRebarBandInfo(NewBand, &rbi); uBand = (UINT)SendMessageW(fRebarWindow, RB_IDTOINDEX, (WPARAM)rbi.wID, 0); if (uBand != (UINT)-1) { if (!SendMessageW(fRebarWindow, RB_DELETEBAND, (WPARAM)uBand, 0)) { ERR("Failed to delete band!\n"); } } else ERR("Failed to map band id to index!\n"); FreeBand(NewBand); hRet = E_FAIL; /* goto Cleanup; */ } } Cleanup: return hRet; }
static void send_end_dialog_msg(HWND hdlg, ps_struct_t *ps_struct, UINT id) { SendMessageW(hdlg, oleui_msg_enddialog, id, 0); }
/* * About dialog callback */ INT_PTR CALLBACK AboutCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { int i; const int edit_id[2] = {IDC_ABOUT_BLURB, IDC_ABOUT_COPYRIGHTS}; char about_blurb[2048]; const char* edit_text[2] = {about_blurb, additional_copyrights}; HWND hEdit[2]; TEXTRANGEW tr; ENLINK* enl; wchar_t wUrl[256]; switch (message) { case WM_INITDIALOG: // Execute dialog localization apply_localization(IDD_ABOUTBOX, hDlg); SetTitleBarIcon(hDlg); CenterDialog(hDlg); if (settings_commcheck) ShowWindow(GetDlgItem(hDlg, IDC_ABOUT_UPDATES), SW_SHOW); safe_sprintf(about_blurb, sizeof(about_blurb), about_blurb_format, lmprintf(MSG_174), lmprintf(MSG_175, rufus_version[0], rufus_version[1], rufus_version[2]), right_to_left_mode?"Akeo \\\\ Pete Batard 2011-2015 © Copyright":"Copyright © 2011-2015 Pete Batard / Akeo", lmprintf(MSG_176), lmprintf(MSG_177), lmprintf(MSG_178)); for (i=0; i<ARRAYSIZE(hEdit); i++) { hEdit[i] = GetDlgItem(hDlg, edit_id[i]); SendMessage(hEdit[i], EM_AUTOURLDETECT, 1, 0); /* Can't use SetDlgItemText, because it only works with RichEdit20A... and VS insists * on reverting to RichEdit20W as soon as you edit the dialog. You can try all the W * methods you want, it JUST WON'T WORK unless you use EM_SETTEXTEX. Also see: * http://blog.kowalczyk.info/article/eny/Setting-unicode-rtf-text-in-rich-edit-control.html */ SendMessageA(hEdit[i], EM_SETTEXTEX, (WPARAM)&friggin_microsoft_unicode_amateurs, (LPARAM)edit_text[i]); SendMessage(hEdit[i], EM_SETSEL, -1, -1); SendMessage(hEdit[i], EM_SETEVENTMASK, 0, ENM_LINK); SendMessage(hEdit[i], EM_SETBKGNDCOLOR, 0, (LPARAM)GetSysColor(COLOR_BTNFACE)); } // Need to send an explicit SetSel to avoid being positioned at the end of richedit control when tabstop is used SendMessage(hEdit[1], EM_SETSEL, 0, 0); break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case EN_LINK: enl = (ENLINK*) lParam; if (enl->msg == WM_LBUTTONUP) { tr.lpstrText = wUrl; tr.chrg.cpMin = enl->chrg.cpMin; tr.chrg.cpMax = enl->chrg.cpMax; SendMessageW(enl->nmhdr.hwndFrom, EM_GETTEXTRANGE, 0, (LPARAM)&tr); wUrl[ARRAYSIZE(wUrl)-1] = 0; ShellExecuteW(hDlg, L"open", wUrl, NULL, NULL, SW_SHOWNORMAL); } break; } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: reset_localization(IDD_ABOUTBOX); EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; case IDC_ABOUT_LICENSE: DialogBoxW(hMainInstance, MAKEINTRESOURCEW(IDD_LICENSE + IDD_OFFSET), hDlg, LicenseCallback); break; case IDC_ABOUT_UPDATES: DialogBoxW(hMainInstance, MAKEINTRESOURCEW(IDD_UPDATE_POLICY + IDD_OFFSET), hDlg, UpdateCallback); break; } break; } return (INT_PTR)FALSE; }
INT_PTR CALLBACK EditSettingDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: { char tmp[32]; SetWindowLongPtr(hwnd,GWLP_USERDATA,(LPARAM)lParam); switch (((struct DBsetting*)lParam)->dbv.type) { case DBVT_BYTE: ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_HIDE); if (!((struct DBsetting*)lParam)->setting[0]) { SetWindowText(hwnd, Translate("New BYTE value")); } else { SetWindowText(hwnd, Translate("Edit BYTE value")); SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); SetDlgItemText(hwnd, IDC_SETTINGVALUE, itoa(((struct DBsetting*)lParam)->dbv.bVal, tmp, 10)); } CheckRadioButton(hwnd, CHK_HEX, CHK_DECIMAL, CHK_DECIMAL); CheckRadioButton(hwnd, CHK_BYTE, CHK_STRING, CHK_BYTE); break; case DBVT_WORD: ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_HIDE); if (!((struct DBsetting*)lParam)->setting[0]) { SetWindowText(hwnd, Translate("New WORD value")); } else { SetWindowText(hwnd, Translate("Edit WORD value")); SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); SetDlgItemText(hwnd, IDC_SETTINGVALUE, itoa(((struct DBsetting*)lParam)->dbv.wVal, tmp, 10)); } CheckRadioButton(hwnd, CHK_HEX, CHK_DECIMAL, CHK_DECIMAL); CheckRadioButton(hwnd, CHK_BYTE, CHK_STRING, CHK_WORD); break; case DBVT_DWORD: ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_HIDE); if (!((struct DBsetting*)lParam)->setting[0]) { SetWindowText(hwnd, Translate("New DWORD value")); } else { char text[32]; SetWindowText(hwnd, Translate("Edit DWORD value")); SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); mir_snprintf(text, SIZEOF(text), "%X", ((struct DBsetting*)lParam)->dbv.dVal); SetDlgItemText(hwnd, IDC_SETTINGVALUE, text); } CheckRadioButton(hwnd, CHK_HEX, CHK_DECIMAL, CHK_HEX); CheckRadioButton(hwnd, CHK_BYTE, CHK_STRING, CHK_DWORD); break; case DBVT_ASCIIZ: ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_SHOW); ShowWindow(GetDlgItem(hwnd, IDC_SETTINGVALUE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_HEX),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_DECIMAL),SW_HIDE); ShowWindow(GetDlgItem(hwnd, GRP_BASE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, GRP_TYPE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_BYTE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_WORD),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_DWORD),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_STRING),SW_HIDE); if (!((struct DBsetting*)lParam)->setting[0]) { SetWindowText(hwnd, Translate("New STRING value")); } else { SetWindowText(hwnd, Translate("Edit STRING value")); SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); SetDlgItemText(hwnd, IDC_STRING, ((struct DBsetting*)lParam)->dbv.pszVal); } break; case DBVT_UTF8: ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_SHOW); ShowWindow(GetDlgItem(hwnd, IDC_SETTINGVALUE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_HEX),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_DECIMAL),SW_HIDE); ShowWindow(GetDlgItem(hwnd, GRP_BASE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, GRP_TYPE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_BYTE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_WORD),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_DWORD),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_STRING),SW_HIDE); if (!((struct DBsetting*)lParam)->setting[0]) { SetWindowText(hwnd, Translate("New UNICODE value")); } else { char *tmp = (((struct DBsetting*)lParam)->dbv.pszVal); if (UOS) { int length = (int)strlen(tmp) + 1; WCHAR *wc = (WCHAR*)_malloca(length*sizeof(WCHAR)); MultiByteToWideChar(CP_UTF8, 0, tmp, -1, wc, length); SendMessageW(GetDlgItem(hwnd, IDC_STRING), WM_SETTEXT, 0, (LPARAM)wc); } else { // convert from UTF8 SetDlgItemText(hwnd, IDC_STRING, tmp); } SetWindowText(hwnd, Translate("Edit UNICODE value")); SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); } break; case DBVT_BLOB: { ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SETTINGVALUE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_BLOB),SW_SHOW); if (!((struct DBsetting*)lParam)->setting[0]) { SetWindowText(hwnd, Translate("New BLOB value")); } else { int j; char tmp[16]; int len = ((struct DBsetting*)lParam)->dbv.cpbVal; char *data = (char*)_malloca(3*(len+1)+10); BYTE *p = ((struct DBsetting*)lParam)->dbv.pbVal; if (!data) return TRUE; data[0] = '\0'; for(j=0; j<len; j++) { mir_snprintf(tmp, SIZEOF(tmp), "%02X ", (BYTE)p[j]); strcat(data, tmp); } SetWindowText(hwnd, Translate("Edit BLOB value")); SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); SetDlgItemText(hwnd, IDC_BLOB, data); } ShowWindow(GetDlgItem(hwnd, CHK_HEX),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_DECIMAL),SW_HIDE); ShowWindow(GetDlgItem(hwnd, GRP_BASE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, GRP_TYPE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_BYTE),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_WORD),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_DWORD),SW_HIDE); ShowWindow(GetDlgItem(hwnd, CHK_STRING),SW_HIDE); } break; default: return TRUE; } TranslateDialogDefault(hwnd); } return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case CHK_BYTE: case CHK_WORD: case CHK_DWORD: EnableWindow(GetDlgItem(hwnd, CHK_HEX),1); EnableWindow(GetDlgItem(hwnd, CHK_DECIMAL),1); CheckRadioButton(hwnd, CHK_BYTE, CHK_STRING, LOWORD(wParam)); break; case CHK_STRING: EnableWindow(GetDlgItem(hwnd, CHK_HEX),0); EnableWindow(GetDlgItem(hwnd, CHK_DECIMAL),0); CheckRadioButton(hwnd, CHK_BYTE, CHK_STRING, LOWORD(wParam)); break; case CHK_HEX: case CHK_DECIMAL: CheckRadioButton(hwnd,CHK_HEX, CHK_DECIMAL, LOWORD(wParam)); { char *setting, temp[32]; int settingLength, tmp; settingLength = GetWindowTextLength(GetDlgItem(hwnd, IDC_SETTINGVALUE)); if (settingLength) { setting = (char*)_malloca(settingLength + 1); if (setting) { // havta convert it with sprintf() GetWindowText(GetDlgItem(hwnd, IDC_SETTINGVALUE), setting, settingLength+1); if (LOWORD(wParam) == CHK_DECIMAL && IsDlgButtonChecked(hwnd, CHK_DECIMAL)) { sscanf(setting, "%X", &tmp); mir_snprintf(temp, SIZEOF(temp), "%ld", tmp); } else { sscanf(setting, "%d", &tmp); mir_snprintf(temp, SIZEOF(temp), "%X", tmp); } SetWindowText(GetDlgItem(hwnd, IDC_SETTINGVALUE), temp); } } } break; case IDOK: { struct DBsetting *dbsetting = (struct DBsetting*)GetWindowLongPtr(hwnd,GWLP_USERDATA); char *setting, *value; int settingLength, valueLength, valueID = IDC_SETTINGVALUE; settingLength = GetWindowTextLength(GetDlgItem(hwnd, IDC_SETTINGNAME)); if (IsWindowVisible(GetDlgItem(hwnd,IDC_STRING))) valueID = IDC_STRING; else if (IsWindowVisible(GetDlgItem(hwnd,IDC_SETTINGVALUE))) valueID = IDC_SETTINGVALUE; else if (IsWindowVisible(GetDlgItem(hwnd,IDC_BLOB))) valueID = IDC_BLOB; else break; valueLength = GetWindowTextLength(GetDlgItem(hwnd, valueID)); if (dbsetting->dbv.type == DBVT_UTF8 && UOS) valueLength *= sizeof(WCHAR); if (settingLength) { int settingValue; setting = (char*)_malloca(settingLength + 1); if (valueLength) value = (char*)_malloca(valueLength + 2); else value = (char*)_malloca(2); if (!setting || !value) { msg(Translate("Couldnt allocate enough memory!"), modFullname); DestroyWindow(hwnd); break; } GetWindowText(GetDlgItem(hwnd, IDC_SETTINGNAME), setting, settingLength+1); if (valueLength) { if (dbsetting->dbv.type == DBVT_UTF8 && UOS) SendMessageW(GetDlgItem(hwnd, valueID), WM_GETTEXT, valueLength+2, (LPARAM)value); else GetWindowText(GetDlgItem(hwnd, valueID), value, valueLength+1); } else if (IsWindowVisible(GetDlgItem(hwnd,IDC_STRING)) || (saveAsType(hwnd)==3)) memcpy(value,"\0\0",2); else strcpy(value,"0"); // delete the old setting if (mir_strcmp(setting, dbsetting->setting) && dbsetting->setting && (dbsetting->setting)[0] != 0) DBDeleteContactSetting(dbsetting->hContact, dbsetting->module, dbsetting->setting); // delete the setting if we are saving as a different type switch (dbsetting->dbv.type) { case DBVT_BYTE: if (saveAsType(hwnd) != 0) DBDeleteContactSetting(dbsetting->hContact, dbsetting->module, setting); break; case DBVT_WORD: if (saveAsType(hwnd) != 1) DBDeleteContactSetting(dbsetting->hContact, dbsetting->module, setting); break; case DBVT_DWORD: if (saveAsType(hwnd) != 2) DBDeleteContactSetting(dbsetting->hContact, dbsetting->module, setting); break; //case DBVT_ASCIIZ: //DBWriteContactSettingString(dbsetting->hContact, dbsetting->module, setting, value); //break; } // write the setting switch (saveAsType(hwnd)) { case 0: if (IsDlgButtonChecked(hwnd, CHK_HEX)) sscanf(value, "%x", &settingValue); else sscanf(value, "%d", &settingValue); DBWriteContactSettingByte(dbsetting->hContact, dbsetting->module, setting, (BYTE)settingValue); break; case 1: if (IsDlgButtonChecked(hwnd, CHK_HEX)) sscanf(value, "%x", &settingValue); else sscanf(value, "%d", &settingValue); DBWriteContactSettingWord(dbsetting->hContact, dbsetting->module, setting, (WORD)settingValue); break; case 2: if (IsDlgButtonChecked(hwnd, CHK_HEX)) sscanf(value, "%x", &settingValue); else sscanf(value, "%d", &settingValue); DBWriteContactSettingDword(dbsetting->hContact, dbsetting->module, setting, (DWORD)settingValue); break; case 3: if (dbsetting->dbv.type == DBVT_UTF8) { if (UOS) DBWriteContactSettingWString(dbsetting->hContact, dbsetting->module, setting, (WCHAR*)value); else DBWriteContactSettingStringUtf(dbsetting->hContact, dbsetting->module, setting, value); } else if (dbsetting->dbv.type == DBVT_BLOB) WriteBlobFromString(dbsetting->hContact,dbsetting->module,setting,value,valueLength); else if (dbsetting->dbv.type == DBVT_ASCIIZ) DBWriteContactSettingString(dbsetting->hContact, dbsetting->module, setting, value); break; } } } // fall through case IDCANCEL: { struct DBsetting *dbsetting = (struct DBsetting*)GetWindowLongPtr(hwnd,GWLP_USERDATA); mir_free(dbsetting->module); mir_free(dbsetting->setting); mir_free(dbsetting); DestroyWindow(hwnd); } break; } break; } return 0; }
/*********************************************************************** * ButtonWndProc_common */ LRESULT WINAPI ButtonWndProc_common(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode ) { RECT rect; POINT pt; LONG style = GetWindowLongPtrW( hWnd, GWL_STYLE ); UINT btn_type = get_button_type( style ); LONG state; HANDLE oldHbitmap; #ifdef __REACTOS__ PWND pWnd; pWnd = ValidateHwnd(hWnd); if (pWnd) { if (!pWnd->fnid) { NtUserSetWindowFNID(hWnd, FNID_BUTTON); } else { if (pWnd->fnid != FNID_BUTTON) { ERR("Wrong window class for Button! fnId 0x%x\n",pWnd->fnid); return 0; } } } #endif pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); switch (uMsg) { case WM_GETDLGCODE: switch(btn_type) { case BS_USERBUTTON: case BS_PUSHBUTTON: return DLGC_BUTTON | DLGC_UNDEFPUSHBUTTON; case BS_DEFPUSHBUTTON: return DLGC_BUTTON | DLGC_DEFPUSHBUTTON; case BS_RADIOBUTTON: case BS_AUTORADIOBUTTON: return DLGC_BUTTON | DLGC_RADIOBUTTON; case BS_GROUPBOX: return DLGC_STATIC; default: return DLGC_BUTTON; } case WM_ENABLE: paint_button( hWnd, btn_type, ODA_DRAWENTIRE ); break; case WM_CREATE: if (!hbitmapCheckBoxes) { BITMAP bmp; hbitmapCheckBoxes = LoadBitmapW(0, MAKEINTRESOURCEW(OBM_CHECKBOXES)); GetObjectW( hbitmapCheckBoxes, sizeof(bmp), &bmp ); checkBoxWidth = bmp.bmWidth / 4; checkBoxHeight = bmp.bmHeight / 3; } if (btn_type >= MAX_BTN_TYPE) return -1; /* abort */ /* XP turns a BS_USERBUTTON into BS_PUSHBUTTON */ if (btn_type == BS_USERBUTTON ) { #ifdef __REACTOS__ style = (style & ~BS_TYPEMASK) | BS_PUSHBUTTON; SetWindowLongPtrW( hWnd, GWL_STYLE, style ); #else style = (style & ~BS_TYPEMASK) | BS_PUSHBUTTON; WIN_SetStyle( hWnd, style, BS_TYPEMASK & ~style ); #endif } set_button_state( hWnd, BST_UNCHECKED ); button_update_uistate( hWnd, unicode ); return 0; #ifdef __REACTOS__ case WM_NCDESTROY: NtUserSetWindowFNID(hWnd, FNID_DESTROY); case WM_DESTROY: break; #endif case WM_ERASEBKGND: if (btn_type == BS_OWNERDRAW) { HDC hdc = (HDC)wParam; RECT rc; HBRUSH hBrush; HWND parent = GetParent(hWnd); if (!parent) parent = hWnd; hBrush = GetControlColor( parent, hWnd, hdc, WM_CTLCOLORBTN); GetClientRect(hWnd, &rc); FillRect(hdc, &rc, hBrush); } return 1; case WM_PRINTCLIENT: case WM_PAINT: if (btnPaintFunc[btn_type]) { PAINTSTRUCT ps; HDC hdc = wParam ? (HDC)wParam : BeginPaint( hWnd, &ps ); int nOldMode = SetBkMode( hdc, OPAQUE ); (btnPaintFunc[btn_type])( hWnd, hdc, ODA_DRAWENTIRE ); SetBkMode(hdc, nOldMode); /* reset painting mode */ if( !wParam ) EndPaint( hWnd, &ps ); } break; case WM_KEYDOWN: if (wParam == VK_SPACE) { SendMessageW( hWnd, BM_SETSTATE, TRUE, 0 ); set_button_state( hWnd, get_button_state( hWnd ) | BUTTON_BTNPRESSED ); SetCapture( hWnd ); } break; case WM_LBUTTONDBLCLK: if(style & BS_NOTIFY || btn_type == BS_RADIOBUTTON || btn_type == BS_USERBUTTON || btn_type == BS_OWNERDRAW) { BUTTON_NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED); break; } /* fall through */ case WM_LBUTTONDOWN: SetCapture( hWnd ); SetFocus( hWnd ); set_button_state( hWnd, get_button_state( hWnd ) | BUTTON_BTNPRESSED ); SendMessageW( hWnd, BM_SETSTATE, TRUE, 0 ); break; case WM_KEYUP: if (wParam != VK_SPACE) break; /* fall through */ case WM_LBUTTONUP: state = get_button_state( hWnd ); if (!(state & BUTTON_BTNPRESSED)) break; state &= BUTTON_NSTATES; set_button_state( hWnd, state ); if (!(state & BST_PUSHED)) { ReleaseCapture(); break; } SendMessageW( hWnd, BM_SETSTATE, FALSE, 0 ); ReleaseCapture(); GetClientRect( hWnd, &rect ); if (uMsg == WM_KEYUP || PtInRect( &rect, pt )) { state = get_button_state( hWnd ); switch(btn_type) { case BS_AUTOCHECKBOX: SendMessageW( hWnd, BM_SETCHECK, !(state & BST_CHECKED), 0 ); break; case BS_AUTORADIOBUTTON: SendMessageW( hWnd, BM_SETCHECK, TRUE, 0 ); break; case BS_AUTO3STATE: SendMessageW( hWnd, BM_SETCHECK, (state & BST_INDETERMINATE) ? 0 : ((state & 3) + 1), 0 ); break; } BUTTON_NOTIFY_PARENT(hWnd, BN_CLICKED); } break; case WM_CAPTURECHANGED: TRACE("WM_CAPTURECHANGED %p\n", hWnd); state = get_button_state( hWnd ); if (state & BUTTON_BTNPRESSED) { state &= BUTTON_NSTATES; set_button_state( hWnd, state ); if (state & BST_PUSHED) SendMessageW( hWnd, BM_SETSTATE, FALSE, 0 ); } break; case WM_MOUSEMOVE: if ((wParam & MK_LBUTTON) && GetCapture() == hWnd) { GetClientRect( hWnd, &rect ); SendMessageW( hWnd, BM_SETSTATE, PtInRect(&rect, pt), 0 ); } break; case WM_SETTEXT: { /* Clear an old text here as Windows does */ // // wine Bug: http://bugs.winehq.org/show_bug.cgi?id=25790 // Patch: http://source.winehq.org/patches/data/70889 // By: Alexander LAW, Replicate Windows behavior of WM_SETTEXT handler regarding WM_CTLCOLOR* // if (style & WS_VISIBLE) { HDC hdc = GetDC(hWnd); HBRUSH hbrush; RECT client, rc; HWND parent = GetParent(hWnd); UINT ctlMessage=(btn_type == BS_PUSHBUTTON || btn_type == BS_DEFPUSHBUTTON || btn_type == BS_PUSHLIKE || btn_type == BS_USERBUTTON || btn_type == BS_OWNERDRAW) ? WM_CTLCOLORBTN : WM_CTLCOLORSTATIC; if (!parent) parent = hWnd; hbrush = GetControlColor( parent, hWnd, hdc, ctlMessage); GetClientRect(hWnd, &client); rc = client; BUTTON_CalcLabelRect(hWnd, hdc, &rc); /* Clip by client rect bounds */ if (rc.right > client.right) rc.right = client.right; if (rc.bottom > client.bottom) rc.bottom = client.bottom; FillRect(hdc, &rc, hbrush); ReleaseDC(hWnd, hdc); } //// if (unicode) DefWindowProcW( hWnd, WM_SETTEXT, wParam, lParam ); else DefWindowProcA( hWnd, WM_SETTEXT, wParam, lParam ); if (btn_type == BS_GROUPBOX) /* Yes, only for BS_GROUPBOX */ InvalidateRect( hWnd, NULL, TRUE ); else paint_button( hWnd, btn_type, ODA_DRAWENTIRE ); return 1; /* success. FIXME: check text length */ } case WM_SETFONT: set_button_font( hWnd, (HFONT)wParam ); if (lParam) InvalidateRect(hWnd, NULL, TRUE); break; case WM_GETFONT: return (LRESULT)get_button_font( hWnd ); case WM_SETFOCUS: TRACE("WM_SETFOCUS %p\n",hWnd); set_button_state( hWnd, get_button_state(hWnd) | BST_FOCUS ); paint_button( hWnd, btn_type, ODA_FOCUS ); if (style & BS_NOTIFY) BUTTON_NOTIFY_PARENT(hWnd, BN_SETFOCUS); break; case WM_KILLFOCUS: TRACE("WM_KILLFOCUS %p\n",hWnd); state = get_button_state( hWnd ); set_button_state( hWnd, state & ~BST_FOCUS ); paint_button( hWnd, btn_type, ODA_FOCUS ); if ((state & BUTTON_BTNPRESSED) && GetCapture() == hWnd) ReleaseCapture(); if (style & BS_NOTIFY) BUTTON_NOTIFY_PARENT(hWnd, BN_KILLFOCUS); InvalidateRect( hWnd, NULL, FALSE ); break; case WM_SYSCOLORCHANGE: InvalidateRect( hWnd, NULL, FALSE ); break; case BM_SETSTYLE: if ((wParam & BS_TYPEMASK) >= MAX_BTN_TYPE) break; btn_type = wParam & BS_TYPEMASK; style = (style & ~BS_TYPEMASK) | btn_type; SetWindowLongPtrW( hWnd, GWL_STYLE, style ); //WIN_SetStyle( hWnd, style, BS_TYPEMASK & ~style ); /* Only redraw if lParam flag is set.*/ if (lParam) InvalidateRect( hWnd, NULL, TRUE ); break; case BM_CLICK: //// ReactOS state = get_button_state( hWnd ); if (state & BUTTON_BMCLICK) break; set_button_state( hWnd, state | BUTTON_BMCLICK ); // Tracked in STATE_GWL_OFFSET. //// SendMessageW( hWnd, WM_LBUTTONDOWN, 0, 0 ); SendMessageW( hWnd, WM_LBUTTONUP, 0, 0 ); //// state = get_button_state( hWnd ); if (!(state & BUTTON_BMCLICK)) break; state &= ~BUTTON_BMCLICK; set_button_state( hWnd, state ); //// break; case BM_SETIMAGE: /* Check that image format matches button style */ switch (style & (BS_BITMAP|BS_ICON)) { case BS_BITMAP: if (wParam != IMAGE_BITMAP) return 0; break; case BS_ICON: if (wParam != IMAGE_ICON) return 0; break; default: return 0; } oldHbitmap = (HBITMAP)SetWindowLongPtrW( hWnd, HIMAGE_GWL_OFFSET, lParam ); InvalidateRect( hWnd, NULL, FALSE ); return (LRESULT)oldHbitmap; case BM_GETIMAGE: return GetWindowLongPtrW( hWnd, HIMAGE_GWL_OFFSET ); case BM_GETCHECK: return get_button_state( hWnd ) & 3; case BM_SETCHECK: if (wParam > maxCheckState[btn_type]) wParam = maxCheckState[btn_type]; state = get_button_state( hWnd ); if ((btn_type == BS_RADIOBUTTON) || (btn_type == BS_AUTORADIOBUTTON)) { #ifdef __REACTOS__ if (wParam) style |= WS_TABSTOP; else style &= ~WS_TABSTOP; SetWindowLongPtrW( hWnd, GWL_STYLE, style ); #else if (wParam) WIN_SetStyle( hWnd, WS_TABSTOP, 0 ); else WIN_SetStyle( hWnd, 0, WS_TABSTOP ); #endif } if ((state & 3) != wParam) { set_button_state( hWnd, (state & ~3) | wParam ); paint_button( hWnd, btn_type, ODA_SELECT ); } if ((btn_type == BS_AUTORADIOBUTTON) && (wParam == BST_CHECKED) && (style & WS_CHILD)) BUTTON_CheckAutoRadioButton( hWnd ); break; case BM_GETSTATE: return get_button_state( hWnd ); case BM_SETSTATE: state = get_button_state( hWnd ); if (wParam) set_button_state( hWnd, state | BST_PUSHED ); else set_button_state( hWnd, state & ~BST_PUSHED ); paint_button( hWnd, btn_type, ODA_SELECT ); break; case WM_UPDATEUISTATE: if (unicode) DefWindowProcW(hWnd, uMsg, wParam, lParam); else DefWindowProcA(hWnd, uMsg, wParam, lParam); if (button_update_uistate(hWnd, unicode)) paint_button( hWnd, btn_type, ODA_DRAWENTIRE ); break; case WM_NCHITTEST: if(btn_type == BS_GROUPBOX) return HTTRANSPARENT; /* fall through */ default: return unicode ? DefWindowProcW(hWnd, uMsg, wParam, lParam) : DefWindowProcA(hWnd, uMsg, wParam, lParam); } return 0; }
INT_PTR CALLBACK ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { RECT rc; int nXDifference; int nYDifference; int cx, cy; LVCOLUMNW column; WCHAR wszTask[255]; WCHAR wszStatus[255]; LoadStringW(hInst, IDS_APPLICATION_TASK, wszTask, sizeof(wszTask)/sizeof(WCHAR)); LoadStringW(hInst, IDS_APPLICATION_STATUS, wszStatus, sizeof(wszStatus)/sizeof(WCHAR)); switch (message) { case WM_INITDIALOG: /* Save the width and height */ GetClientRect(hDlg, &rc); nApplicationPageWidth = rc.right; nApplicationPageHeight = rc.bottom; /* Update window position */ SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); /* Get handles to the controls */ hApplicationPageListCtrl = GetDlgItem(hDlg, IDC_APPLIST); hApplicationPageEndTaskButton = GetDlgItem(hDlg, IDC_ENDTASK); hApplicationPageSwitchToButton = GetDlgItem(hDlg, IDC_SWITCHTO); hApplicationPageNewTaskButton = GetDlgItem(hDlg, IDC_NEWTASK); /* Initialize the application page's controls */ column.mask = LVCF_TEXT|LVCF_WIDTH; column.pszText = wszTask; column.cx = 250; /* Add the "Task" column */ SendMessageW(hApplicationPageListCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM) &column); column.mask = LVCF_TEXT|LVCF_WIDTH; column.pszText = wszStatus; column.cx = 95; /* Add the "Status" column */ SendMessageW(hApplicationPageListCtrl, LVM_INSERTCOLUMNW, 1, (LPARAM) &column); SendMessageW(hApplicationPageListCtrl, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM) ImageList_Create(16, 16, ILC_COLOR8|ILC_MASK, 0, 1)); SendMessageW(hApplicationPageListCtrl, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM) ImageList_Create(32, 32, ILC_COLOR8|ILC_MASK, 0, 1)); UpdateApplicationListControlViewSetting(); /* Start our refresh thread */ CloseHandle( CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, NULL)); return TRUE; case WM_DESTROY: /* Close the event handle, this will make the */ /* refresh thread exit when the wait fails */ CloseHandle(hApplicationPageEvent); break; case WM_COMMAND: /* Handle the button clicks */ switch (LOWORD(wParam)) { case IDC_ENDTASK: ApplicationPage_OnEndTask(); break; case IDC_SWITCHTO: ApplicationPage_OnSwitchTo(); break; case IDC_NEWTASK: SendMessageW(hMainWnd, WM_COMMAND, MAKEWPARAM(ID_FILE_NEW, 0), 0); break; } break; case WM_SIZE: if (wParam == SIZE_MINIMIZED) return 0; cx = LOWORD(lParam); cy = HIWORD(lParam); nXDifference = cx - nApplicationPageWidth; nYDifference = cy - nApplicationPageHeight; nApplicationPageWidth = cx; nApplicationPageHeight = cy; /* Reposition the application page's controls */ GetWindowRect(hApplicationPageListCtrl, &rc); cx = (rc.right - rc.left) + nXDifference; cy = (rc.bottom - rc.top) + nYDifference; SetWindowPos(hApplicationPageListCtrl, NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOMOVE|SWP_NOZORDER); InvalidateRect(hApplicationPageListCtrl, NULL, TRUE); GetClientRect(hApplicationPageEndTaskButton, &rc); MapWindowPoints(hApplicationPageEndTaskButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) ); cx = rc.left + nXDifference; cy = rc.top + nYDifference; SetWindowPos(hApplicationPageEndTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); InvalidateRect(hApplicationPageEndTaskButton, NULL, TRUE); GetClientRect(hApplicationPageSwitchToButton, &rc); MapWindowPoints(hApplicationPageSwitchToButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) ); cx = rc.left + nXDifference; cy = rc.top + nYDifference; SetWindowPos(hApplicationPageSwitchToButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); InvalidateRect(hApplicationPageSwitchToButton, NULL, TRUE); GetClientRect(hApplicationPageNewTaskButton, &rc); MapWindowPoints(hApplicationPageNewTaskButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) ); cx = rc.left + nXDifference; cy = rc.top + nYDifference; SetWindowPos(hApplicationPageNewTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); InvalidateRect(hApplicationPageNewTaskButton, NULL, TRUE); break; case WM_NOTIFY: ApplicationPageOnNotify(wParam, lParam); break; } return 0; }
static void ApplicationPageOnNotify(WPARAM wParam, LPARAM lParam) { LPNMHDR pnmh; LV_DISPINFOW* pnmdi; LPAPPLICATION_PAGE_LIST_ITEM pAPLI; WCHAR wszNotResponding[255]; WCHAR wszRunning[255]; LoadStringW(hInst, IDS_APPLICATION_NOT_RESPONDING, wszNotResponding, sizeof(wszNotResponding)/sizeof(WCHAR)); LoadStringW(hInst, IDS_APPLICATION_RUNNING, wszRunning, sizeof(wszRunning)/sizeof(WCHAR)); pnmh = (LPNMHDR) lParam; pnmdi = (LV_DISPINFOW*) lParam; if (pnmh->hwndFrom == hApplicationPageListCtrl) { switch (pnmh->code) { case LVN_ITEMCHANGED: ApplicationPageUpdate(); break; case LVN_GETDISPINFOW: pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)pnmdi->item.lParam; /* Update the item text */ if (pnmdi->item.iSubItem == 0) { lstrcpynW(pnmdi->item.pszText, pAPLI->wszTitle, pnmdi->item.cchTextMax); } /* Update the item status */ else if (pnmdi->item.iSubItem == 1) { if (pAPLI->bHung) lstrcpynW(pnmdi->item.pszText, wszNotResponding, pnmdi->item.cchTextMax); else lstrcpynW(pnmdi->item.pszText, wszRunning, pnmdi->item.cchTextMax); } break; case NM_RCLICK: if (SendMessageW(hApplicationPageListCtrl, LVM_GETSELECTEDCOUNT, 0, 0) < 1) { ApplicationPageShowContextMenu1(); } else { ApplicationPageShowContextMenu2(); } break; case NM_DBLCLK: ApplicationPage_OnSwitchTo(); break; } } else if (pnmh->hwndFrom == (HWND)SendMessageW(hApplicationPageListCtrl, LVM_GETHEADER, 0, 0)) { switch (pnmh->code) { case NM_RCLICK: if (SendMessageW(hApplicationPageListCtrl, LVM_GETSELECTEDCOUNT, 0, 0) < 1) { ApplicationPageShowContextMenu1(); } else { ApplicationPageShowContextMenu2(); } break; case HDN_ITEMCLICKW: SendMessageW(hApplicationPageListCtrl, LVM_SORTITEMS, 0, (LPARAM) ApplicationPageCompareFunc); bSortAscending = !bSortAscending; break; } } }
static void AddOrUpdateHwnd(HWND hWnd, WCHAR *wszTitle, HICON hIcon, BOOL bHung) { LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL; HIMAGELIST hImageListLarge; HIMAGELIST hImageListSmall; LV_ITEMW item; int i, count; BOOL bAlreadyInList = FALSE; BOOL bItemRemoved = FALSE; memset(&item, 0, sizeof(LV_ITEMW)); /* Get the image lists */ hImageListLarge = (HIMAGELIST)SendMessageW(hApplicationPageListCtrl, LVM_GETIMAGELIST, LVSIL_NORMAL, 0); hImageListSmall = (HIMAGELIST)SendMessageW(hApplicationPageListCtrl, LVM_GETIMAGELIST, LVSIL_SMALL, 0); count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0); /* Check to see if it's already in our list */ for (i=0; i<count; i++) { memset(&item, 0, sizeof(LV_ITEMW)); item.mask = LVIF_IMAGE|LVIF_PARAM; item.iItem = i; SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item); pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam; if (pAPLI->hWnd == hWnd) { bAlreadyInList = TRUE; break; } } /* If it is already in the list then update it if necessary */ if (bAlreadyInList) { /* Check to see if anything needs updating */ if ((pAPLI->hIcon != hIcon) || (strcmpW(pAPLI->wszTitle, wszTitle) != 0) || (pAPLI->bHung != bHung)) { /* Update the structure */ pAPLI->hIcon = hIcon; pAPLI->bHung = bHung; strcpyW(pAPLI->wszTitle, wszTitle); /* Update the image list */ ImageList_ReplaceIcon(hImageListLarge, item.iItem, hIcon); ImageList_ReplaceIcon(hImageListSmall, item.iItem, hIcon); /* Update the list view */ count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0); SendMessageW(hApplicationPageListCtrl, LVM_REDRAWITEMS, 0, count); /* UpdateWindow(hApplicationPageListCtrl); */ InvalidateRect(hApplicationPageListCtrl, NULL, 0); } } /* It is not already in the list so add it */ else { pAPLI = HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_PAGE_LIST_ITEM)); pAPLI->hWnd = hWnd; pAPLI->hIcon = hIcon; pAPLI->bHung = bHung; strcpyW(pAPLI->wszTitle, wszTitle); /* Add the item to the list */ memset(&item, 0, sizeof(LV_ITEMW)); item.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM; ImageList_AddIcon(hImageListLarge, hIcon); item.iImage = ImageList_AddIcon(hImageListSmall, hIcon); item.pszText = LPSTR_TEXTCALLBACKW; item.iItem = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0); item.lParam = (LPARAM)pAPLI; SendMessageW(hApplicationPageListCtrl, LVM_INSERTITEMW, 0, (LPARAM) &item); } /* Check to see if we need to remove any items from the list */ for (i=SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0)-1; i>=0; i--) { memset(&item, 0, sizeof(LV_ITEMW)); item.mask = LVIF_IMAGE|LVIF_PARAM; item.iItem = i; SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item); pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam; if (!IsWindow(pAPLI->hWnd)|| (strlenW(pAPLI->wszTitle) <= 0) || !IsWindowVisible(pAPLI->hWnd) || (GetParent(pAPLI->hWnd) != NULL) || (GetWindow(pAPLI->hWnd, GW_OWNER) != NULL) || (GetWindowLongW(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW)) { ImageList_Remove(hImageListLarge, item.iItem); ImageList_Remove(hImageListSmall, item.iItem); SendMessageW(hApplicationPageListCtrl, LVM_DELETEITEM, item.iItem, 0); HeapFree(GetProcessHeap(), 0, pAPLI); bItemRemoved = TRUE; } } /* * If an item was removed from the list then * we need to resync all the items with the * image list */ if (bItemRemoved) { count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0); for (i=0; i<count; i++) { memset(&item, 0, sizeof(LV_ITEMW)); item.mask = LVIF_IMAGE; item.iItem = i; item.iImage = i; SendMessageW(hApplicationPageListCtrl, LVM_SETITEMW, 0, (LPARAM) &item); } } ApplicationPageUpdate(); }
LRESULT MusPlayer_WinAPI::SubCtrlProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static WNDPROC OrigBtnProc = reinterpret_cast<WNDPROC>(static_cast<LONG_PTR>(GetWindowLongPtr(hWnd, GWLP_USERDATA))); switch (msg) { case WM_COMMAND: { switch( LOWORD(wParam) ) { case CMD_TrackID: { switch(HIWORD(wParam)) { case EN_UPDATE: { char trackIDtext[1024]; memset(trackIDtext, 0, 1024); GetWindowTextA(m_self->m_gme.m_trackNum, trackIDtext, 1024); //int trackID = atoi(trackIDtext); SetWindowTextA(m_self->m_gme.m_labelTrack, trackIDtext); m_self->on_trackID_editingFinished(); goto defaultWndProc; } } goto defaultWndProc; } case CMD_MidiDevice: { switch(HIWORD(wParam)) { case CBN_SELCHANGE: { LRESULT index = SendMessageW(m_self->m_midi.m_midiDevice, CB_GETCURSEL, 0, 0); if(index != CB_ERR) m_self->on_mididevice_currentIndexChanged(index); goto defaultWndProc; } break; default: break; } goto defaultWndProc; } case CMD_Bank: { switch(HIWORD(wParam)) { case CBN_SELCHANGE: { LRESULT index = SendMessageW(m_self->m_adlmidi.m_bankID, CB_GETCURSEL, 0, 0); if(index != CB_ERR) m_self->on_fmbank_currentIndexChanged(index); goto defaultWndProc; } break; default: break; } goto defaultWndProc; } case CMD_Tremolo: { BOOL checked = IsDlgButtonChecked(hWnd, CMD_Tremolo); if (checked) { CheckDlgButton(hWnd, CMD_Tremolo, BST_UNCHECKED); m_self->on_tremolo_clicked(false); } else { CheckDlgButton(hWnd, CMD_Tremolo, BST_CHECKED); m_self->on_tremolo_clicked(true); } goto defaultWndProc; } case CMD_Vibrato: { BOOL checked = IsDlgButtonChecked(hWnd, CMD_Vibrato); if (checked) { CheckDlgButton(hWnd, CMD_Vibrato, BST_UNCHECKED); m_self->on_vibrato_clicked(false); } else { CheckDlgButton(hWnd, CMD_Vibrato, BST_CHECKED); m_self->on_vibrato_clicked(true); } goto defaultWndProc; } case CMD_ScalableMod: { BOOL checked = IsDlgButtonChecked(hWnd, CMD_ScalableMod); if (checked) { CheckDlgButton(hWnd, CMD_ScalableMod, BST_UNCHECKED); m_self->on_modulation_clicked(false); } else { CheckDlgButton(hWnd, CMD_ScalableMod, BST_CHECKED); m_self->on_modulation_clicked(true); } goto defaultWndProc; } case CMD_AdLibDrums: { BOOL checked = IsDlgButtonChecked(hWnd, CMD_AdLibDrums); if (checked) { CheckDlgButton(hWnd, CMD_AdLibDrums, BST_UNCHECKED); m_self->on_adlibMode_clicked(false); } else { CheckDlgButton(hWnd, CMD_AdLibDrums, BST_CHECKED); m_self->on_adlibMode_clicked(true); } goto defaultWndProc; } default: break; } } } defaultWndProc: return CallWindowProc(OrigBtnProc, hWnd, msg, wParam, lParam); }
static LRESULT CALLBACK MonthCalWndProc(IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam) { PMONTHCALWND infoPtr; LRESULT Ret = 0; infoPtr = (PMONTHCALWND)GetWindowLongPtrW(hwnd, 0); if (infoPtr == NULL && uMsg != WM_CREATE) { goto HandleDefaultMessage; } switch (uMsg) { #if MONTHCAL_CTRLBG != MONTHCAL_DISABLED_CTRLBG case WM_ERASEBKGND: Ret = !infoPtr->Enabled; break; #endif case WM_PAINT: case WM_PRINTCLIENT: { if (infoPtr->CellSize.cx != 0 && infoPtr->CellSize.cy != 0) { PAINTSTRUCT ps; HDC hDC; if (wParam != 0) { if (!GetUpdateRect(hwnd, &ps.rcPaint, TRUE)) { break; } hDC = (HDC)wParam; } else { hDC = BeginPaint(hwnd, &ps); if (hDC == NULL) { break; } } MonthCalPaint(infoPtr, hDC, &ps.rcPaint); if (wParam == 0) { EndPaint(hwnd, &ps); } } break; } case WM_LBUTTONDBLCLK: case WM_LBUTTONDOWN: { WORD SelDay; SelDay = MonthCalPtToDay(infoPtr, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); if (SelDay != 0 && SelDay != infoPtr->Day) { MonthCalSetDate(infoPtr, SelDay, infoPtr->Month, infoPtr->Year); } /* Fall through */ } case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: { if (!infoPtr->HasFocus) { SetFocus(hwnd); } break; } case WM_KEYDOWN: { WORD NewDay = 0; switch (wParam) { case VK_UP: { if (infoPtr->Day > 7) { NewDay = infoPtr->Day - 7; } break; } case VK_DOWN: { if (infoPtr->Day + 7 <= MonthCalMonthLength(infoPtr->Month, infoPtr->Year)) { NewDay = infoPtr->Day + 7; } break; } case VK_LEFT: { if (infoPtr->Day > 1) { NewDay = infoPtr->Day - 1; } break; } case VK_RIGHT: { if (infoPtr->Day < MonthCalMonthLength(infoPtr->Month, infoPtr->Year)) { NewDay = infoPtr->Day + 1; } break; } } /* Update the selection */ if (NewDay != 0) { MonthCalSetDate(infoPtr, NewDay, infoPtr->Month, infoPtr->Year); } goto HandleDefaultMessage; } case WM_GETDLGCODE: { INT virtKey; virtKey = (lParam != 0 ? (INT)((LPMSG)lParam)->wParam : 0); switch (virtKey) { case VK_TAB: { /* Change the UI status */ SendMessageW(GetAncestor(hwnd, GA_PARENT), WM_CHANGEUISTATE, MAKEWPARAM(UIS_INITIALIZE, 0), 0); break; } } Ret |= DLGC_WANTARROWS; break; } case WM_SETFOCUS: { infoPtr->HasFocus = TRUE; MonthCalRepaintDay(infoPtr, infoPtr->Day); break; } case WM_KILLFOCUS: { infoPtr->HasFocus = FALSE; MonthCalRepaintDay(infoPtr, infoPtr->Day); break; } case WM_UPDATEUISTATE: { DWORD OldUIState; Ret = DefWindowProcW(hwnd, uMsg, wParam, lParam); OldUIState = infoPtr->UIState; switch (LOWORD(wParam)) { case UIS_SET: infoPtr->UIState |= HIWORD(wParam); break; case UIS_CLEAR: infoPtr->UIState &= ~HIWORD(wParam); break; } if (infoPtr->UIState != OldUIState) { MonthCalRepaintDay(infoPtr, infoPtr->Day); } break; } case MCCM_SETDATE: { WORD Day, Month, Year, DaysCount; Day = LOWORD(wParam); Month = HIWORD(wParam); Year = LOWORD(lParam); if (Day == (WORD)-1) Day = infoPtr->Day; if (Month == (WORD)-1) Month = infoPtr->Month; if (Year == (WORD)-1) Year = infoPtr->Year; DaysCount = MonthCalMonthLength(Month, Year); if (Day > DaysCount) Day = DaysCount; if (MonthCalValidDate(Day, Month, Year)) { if (Day != infoPtr->Day || Month != infoPtr->Month || Year != infoPtr->Year) { Ret = MonthCalSetDate(infoPtr, Day, Month, Year); } } break; } case MCCM_GETDATE: { LPSYSTEMTIME lpSystemTime = (LPSYSTEMTIME)wParam; lpSystemTime->wYear = infoPtr->Year; lpSystemTime->wMonth = infoPtr->Month; lpSystemTime->wDay = infoPtr->Day; Ret = TRUE; break; } case MCCM_RESET: { MonthCalSetLocalTime(infoPtr, NULL); Ret = TRUE; break; } case MCCM_CHANGED: { Ret = infoPtr->Changed; break; } case WM_TIMER: { switch (wParam) { case ID_DAYTIMER: { /* Kill the timer */ KillTimer(hwnd, ID_DAYTIMER); infoPtr->DayTimerSet = FALSE; if (!infoPtr->Changed) { /* Update the system time and setup the new day timer */ MonthCalSetLocalTime(infoPtr, NULL); /* Update the control */ MonthCalUpdate(infoPtr); } break; } } break; } case WM_SETFONT: { Ret = (LRESULT)MonthCalChangeFont(infoPtr, (HFONT)wParam, (BOOL)LOWORD(lParam)); break; } case WM_SIZE: { infoPtr->ClientSize.cx = LOWORD(lParam); infoPtr->ClientSize.cy = HIWORD(lParam); infoPtr->CellSize.cx = infoPtr->ClientSize.cx / 7; infoPtr->CellSize.cy = infoPtr->ClientSize.cy / 7; /* Repaint the control */ InvalidateRect(hwnd, NULL, TRUE); break; } case WM_GETFONT: { Ret = (LRESULT)infoPtr->hFont; break; } case WM_ENABLE: { infoPtr->Enabled = ((BOOL)wParam != FALSE); MonthCalReload(infoPtr); break; } case WM_STYLECHANGED: { if (wParam == GWL_STYLE) { unsigned int OldEnabled = infoPtr->Enabled; infoPtr->Enabled = !(((LPSTYLESTRUCT)lParam)->styleNew & WS_DISABLED); if (OldEnabled != infoPtr->Enabled) { MonthCalReload(infoPtr); } } break; } case WM_CREATE: { infoPtr = (MONTHCALWND*) HeapAlloc(GetProcessHeap(), 0, sizeof(MONTHCALWND)); if (infoPtr == NULL) { Ret = (LRESULT)-1; break; } SetWindowLongPtrW(hwnd, 0, (LONG_PTR)infoPtr); ZeroMemory(infoPtr, sizeof(MONTHCALWND)); infoPtr->hSelf = hwnd; infoPtr->hNotify = ((LPCREATESTRUCTW)lParam)->hwndParent; infoPtr->Enabled = !(((LPCREATESTRUCTW)lParam)->style & WS_DISABLED); MonthCalSetLocalTime(infoPtr, NULL); MonthCalReload(infoPtr); break; } case WM_DESTROY: { HeapFree(GetProcessHeap(), 0, infoPtr); SetWindowLongPtrW(hwnd, 0, (DWORD_PTR)NULL); break; } default: { HandleDefaultMessage: Ret = DefWindowProcW(hwnd, uMsg, wParam, lParam); break; } } return Ret; }
void MusPlayer_WinAPI::initUI(HWND hWnd) { HGDIOBJ hFont = GetStockObject(DEFAULT_GUI_FONT); HFONT hFontBold = CreateFontW(-11, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Tahoma"); int left = 5; int top = 10; HWND hText = CreateWindowExW(0, L"STATIC", L"Press \"Open\" or drag&&drop music file into this window", WS_CHILD | WS_VISIBLE | SS_LEFT, left, top, 400, 15, hWnd, NULL, m_hInstance, NULL); top += 25; m_labelTitle = CreateWindowExW(0, L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT, left, top, 400, 15, hWnd, NULL, m_hInstance, NULL); top += 15; m_labelArtist = CreateWindowExW(0, L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT, left, top, 400, 15, hWnd, NULL, m_hInstance, NULL); top += 15; m_labelAlboom = CreateWindowExW(0, L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT, left, top, 400, 15, hWnd, NULL, m_hInstance, NULL); top += 15; m_labelCopyright = CreateWindowExW(0, L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT, left, top, 400, 15, hWnd, NULL, m_hInstance, NULL); top += 15; m_buttonOpen = CreateWindowExW(0, L"BUTTON", L"Open", WS_TABSTOP|WS_VISIBLE|WS_CHILD, left, top, 60, 21, hWnd, (HMENU)CMD_Open, // Here is the ID of your button ( You may use your own ID ) m_hInstance, NULL); left += 60; m_buttonPlay = CreateWindowExW(0, L"BUTTON", L"Play/Pause", WS_TABSTOP|WS_VISIBLE|WS_CHILD, left, top, 60, 21, hWnd, (HMENU)CMD_Play, // Here is the ID of your button ( You may use your own ID ) m_hInstance, NULL); left += 60; m_buttonStop = CreateWindowExW(0, L"BUTTON", L"Stop", WS_TABSTOP|WS_VISIBLE|WS_CHILD, left, top, 60, 21, hWnd, (HMENU)CMD_Stop, // Here is the ID of your button ( You may use your own ID ) m_hInstance, NULL); left += 60; m_volume = CreateWindowExW(0, TRACKBAR_CLASS, L"Volume", WS_TABSTOP|WS_VISIBLE|WS_CHILD, left, top-2, 80, 25, hWnd, (HMENU)CMD_Volume, // Here is the ID of your button ( You may use your own ID ) m_hInstance, NULL); SendMessageW(m_volume, TBM_SETRANGE, (WPARAM)TRUE, //redraw flag (LPARAM)MAKELONG(0, 128)); //min. & max. positions SendMessageW(m_volume, TBM_SETPOS, (WPARAM)TRUE, //redraw flag (LPARAM)128); SendMessageW(m_volume, WM_SETFONT, (WPARAM)hFont, 0); left += 80; m_formatInfo = CreateWindowExW(0, L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT, left, top, 200, 15, hWnd, NULL, m_hInstance, NULL); SendMessageW(m_formatInfo, WM_SETFONT, (WPARAM)hFont, 0); left = 5; top += 21; m_recordWave = CreateWindowExW(0, L"BUTTON", L"Record wave", WS_TABSTOP|WS_VISIBLE|WS_CHILD|SS_LEFT|BS_CHECKBOX, left, top, 200, 15, hWnd, (HMENU)CMD_RecordWave, m_hInstance, NULL); SendMessageW(m_recordWave, WM_SETFONT, (WPARAM)hFont, 0); CheckDlgButton(m_groupADLMIDI, CMD_RecordWave, BST_UNCHECKED); top += 18; WNDPROC OldBtnProc; m_groupGME = CreateWindowExW(0, L"BUTTON", L"Game Music Emulators setup", WS_VISIBLE | WS_CHILD | BS_GROUPBOX, left, top, 330, 50, hWnd, (HMENU)GRP_GME, m_hInstance, NULL); SendMessageW(m_groupGME, WM_SETFONT, (WPARAM)hFont, 0); OldBtnProc = reinterpret_cast<WNDPROC>(static_cast<LONG_PTR>( SetWindowLongPtr(m_groupGME, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(MusPlayer_WinAPI::SubCtrlProc))) ); SetWindowLongPtr(m_groupGME, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(OldBtnProc)); m_gme.m_labelTrack = CreateWindowExW(0, L"STATIC", L"Track number:", WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 20, 70, 15, m_groupGME, NULL, m_hInstance, NULL); SendMessageW(m_gme.m_labelTrack, WM_SETFONT, (WPARAM)hFont, 0); m_gme.m_trackNum = CreateWindowExW(0, L"EDIT", L"ED_RED", WS_TABSTOP|WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER, 80, 20, 240, 20, m_groupGME, (HMENU)(CMD_TrackID), m_hInstance, NULL); SendMessageW(m_gme.m_trackNum, WM_SETFONT, (WPARAM)hFont, 0); // with a spin control to its right side m_gme.m_trackNumUpDown = CreateWindowExW(0, UPDOWN_CLASS, L"SP_RED", WS_TABSTOP|WS_CHILD | WS_VISIBLE | UDS_ARROWKEYS | UDS_ALIGNRIGHT | UDS_SETBUDDYINT | WS_BORDER, 80, 20, 240, 20, m_groupGME, (HMENU)(CMD_TrackIDspin), m_hInstance, NULL); SendMessageW(m_gme.m_trackNumUpDown, WM_SETFONT, (WPARAM)hFont, 0); // Set the buddy control. SendMessage(m_gme.m_trackNumUpDown, UDM_SETBUDDY, (LONG)m_gme.m_trackNum, 0L); // Set the range. SendMessage(m_gme.m_trackNumUpDown, UDM_SETRANGE, 0L, MAKELONG(32000, 0) ); // Set the initial value SendMessage(m_gme.m_trackNumUpDown, UDM_SETPOS, 0L, MAKELONG((int)(0), 0)); //SendMessage(m_gme.m_trackNumUpDown, UDS_WRAP, 0L, FALSE); m_groupMIDI = CreateWindowExW(0, L"BUTTON", L"MIDI Setup", WS_VISIBLE|WS_CHILD|BS_GROUPBOX|WS_GROUP, left, top, 330, 50, hWnd, (HMENU)GRP_MIDI, m_hInstance, NULL); SendMessageW(m_groupMIDI, WM_SETFONT, (WPARAM)hFont, 0); OldBtnProc = reinterpret_cast<WNDPROC>(static_cast<LONG_PTR>( SetWindowLongPtr(m_groupMIDI, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(MusPlayer_WinAPI::SubCtrlProc))) ); SetWindowLongPtr(m_groupMIDI, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(OldBtnProc)); top += 50; m_midi.m_labelDevice = CreateWindowExW(0, L"STATIC", L"MIDI Device:", WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 20, 70, 15, m_groupMIDI, NULL, m_hInstance, NULL); SendMessageW(m_midi.m_labelDevice, WM_SETFONT, (WPARAM)hFont, 0); const wchar_t* midiDevices[] = { L"ADL Midi (OPL Synth emulation)", L"Timidity (GUS-like wavetable MIDI Synth)", L"Native midi (Built-in MIDI of your OS)" }; m_midi.m_midiDevice = CreateWindowExW(0, L"COMBOBOX", L"MidiDevice", WS_TABSTOP|WS_VISIBLE|WS_CHILD|CBS_DROPDOWNLIST|WS_TABSTOP, 80, 17, 240, 210, m_groupMIDI, (HMENU)CMD_MidiDevice, m_hInstance, NULL); SendMessageW(m_midi.m_midiDevice, WM_SETFONT, (WPARAM)hFont, 0); SendMessageW(m_midi.m_midiDevice, CB_ADDSTRING, 0, (LPARAM)midiDevices[0]); SendMessageW(m_midi.m_midiDevice, CB_ADDSTRING, 0, (LPARAM)midiDevices[1]); SendMessageW(m_midi.m_midiDevice, CB_ADDSTRING, 0, (LPARAM)midiDevices[2]); SendMessageW(m_midi.m_midiDevice, CB_SETCURSEL, 0, 0); m_groupADLMIDI = CreateWindowExW(0, L"BUTTON", L"ADLMIDI Extra Setup", WS_VISIBLE|WS_CHILD|BS_GROUPBOX|WS_GROUP, left, top, 330, 125, hWnd, (HMENU)GRP_ADLMIDI, m_hInstance, NULL); SendMessageW(m_groupADLMIDI, WM_SETFONT, (WPARAM)hFont, 0); //top += 50; OldBtnProc=reinterpret_cast<WNDPROC>(static_cast<LONG_PTR>( SetWindowLongPtr(m_groupADLMIDI, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(MusPlayer_WinAPI::SubCtrlProc))) ); SetWindowLongPtr(m_groupADLMIDI, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(OldBtnProc)); m_adlmidi.m_labelBank = CreateWindowExW(0, L"STATIC", L"ADL Midi bank ID:", WS_CHILD|WS_VISIBLE | SS_LEFT, 10, 20, 70, 15, m_groupADLMIDI, NULL, m_hInstance, NULL); SendMessageW(m_adlmidi.m_labelBank, WM_SETFONT, (WPARAM)hFont, 0); m_adlmidi.m_bankID = CreateWindowExW(0, L"COMBOBOX", L"BankId", WS_TABSTOP|WS_VISIBLE|WS_CHILD|CBS_DROPDOWNLIST|CBS_DISABLENOSCROLL|WS_VSCROLL|CBS_NOINTEGRALHEIGHT|WS_TABSTOP, 80, 17, 240, 210, m_groupADLMIDI, (HMENU)CMD_Bank, m_hInstance, NULL); SendMessageW(m_adlmidi.m_bankID, WM_SETFONT, (WPARAM)hFont, 0); int insCount = MIX_ADLMIDI_getTotalBanks(); const char*const* names = MIX_ADLMIDI_getBankNames(); for(int i=0; i<insCount; i++) { SendMessageA(m_adlmidi.m_bankID, CB_ADDSTRING, 0, (LPARAM)names[i]); } SendMessageW(m_adlmidi.m_bankID, CB_SETCURSEL, 58, 0); m_adlmidi.m_tremolo = CreateWindowExW(0, L"BUTTON", L"Deep tremolo", WS_TABSTOP|WS_VISIBLE|WS_CHILD|SS_LEFT|BS_CHECKBOX, 10, 40, 200, 15, m_groupADLMIDI, (HMENU)CMD_Tremolo, m_hInstance, NULL); SendMessageW(m_adlmidi.m_tremolo, WM_SETFONT, (WPARAM)hFont, 0); CheckDlgButton(m_groupADLMIDI, CMD_Tremolo, BST_CHECKED); m_adlmidi.m_vibrato = CreateWindowExW(0, L"BUTTON", L"Deep vibrato", WS_TABSTOP|WS_VISIBLE|WS_CHILD|SS_LEFT|BS_CHECKBOX, 10, 60, 200, 15, m_groupADLMIDI, (HMENU)CMD_Vibrato, m_hInstance, NULL); SendMessageW(m_adlmidi.m_vibrato, WM_SETFONT, (WPARAM)hFont, 0); CheckDlgButton(m_groupADLMIDI, CMD_Vibrato, BST_CHECKED); m_adlmidi.m_scalableMod = CreateWindowExW(0, L"BUTTON", L"Scalable modulation", WS_TABSTOP|WS_VISIBLE|WS_CHILD|SS_LEFT|BS_CHECKBOX, 10, 80, 200, 15, m_groupADLMIDI, (HMENU)CMD_ScalableMod, m_hInstance, NULL); SendMessageW(m_adlmidi.m_scalableMod, WM_SETFONT, (WPARAM)hFont, 0); CheckDlgButton(m_groupADLMIDI, CMD_ScalableMod, BST_UNCHECKED); m_adlmidi.m_adlibDrums = CreateWindowExW(0, L"BUTTON", L"AdLib drums mode", WS_TABSTOP|WS_VISIBLE|WS_CHILD|SS_LEFT|BS_CHECKBOX, 10, 100, 200, 15, m_groupADLMIDI, (HMENU)CMD_AdLibDrums, m_hInstance, NULL); SendMessageW(m_adlmidi.m_adlibDrums, WM_SETFONT, (WPARAM)hFont, 0); CheckDlgButton(m_groupADLMIDI, CMD_AdLibDrums, BST_UNCHECKED); ShowWindow(m_groupGME, SW_HIDE); ShowWindow(m_groupMIDI, SW_HIDE); ShowWindow(m_groupADLMIDI, SW_HIDE); SendMessageW(hWnd, WM_SETFONT, (WPARAM)hFont, 0); SendMessageW(m_buttonOpen, WM_SETFONT, (WPARAM)hFont, 0); SendMessageW(m_buttonPlay, WM_SETFONT, (WPARAM)hFont, 0); SendMessageW(m_buttonStop, WM_SETFONT, (WPARAM)hFont, 0); SendMessageW(hText, WM_SETFONT, (WPARAM)hFontBold, 0); SendMessageW(m_labelTitle, WM_SETFONT, (WPARAM)hFont, 0); SendMessageW(m_labelArtist, WM_SETFONT, (WPARAM)hFont, 0); SendMessageW(m_labelAlboom, WM_SETFONT, (WPARAM)hFont, 0); SendMessageW(m_labelCopyright, WM_SETFONT, (WPARAM)hFont, 0); SetWindowTextW(hWnd, L"Simple SDL2 Mixer X Music player [WinAPI-based]"); HMENU hSubMenu; m_contextMenu = CreatePopupMenu(); AppendMenuW(m_contextMenu, MF_STRING, CMD_Open, L"Open"); AppendMenuW(m_contextMenu, MF_STRING, CMD_Play, L"Play/Pause"); AppendMenuW(m_contextMenu, MF_STRING, CMD_Stop, L"Stop"); AppendMenuW(m_contextMenu, MF_SEPARATOR, 0, 0); AppendMenuW(m_contextMenu, MF_STRING, CMD_Reverb, L"Reverb"); AppendMenuW(m_contextMenu, MF_STRING, CMD_AssocFiles, L"Associate files"); EnableMenuItem(m_contextMenu, CMD_AssocFiles, MF_GRAYED); AppendMenuW(m_contextMenu, MF_SEPARATOR, 0, 0); hSubMenu = CreatePopupMenu(); AppendMenuA(hSubMenu, MF_STRING, CMD_Version, "SDL Mixer X Music Player [WinAPI], v." _FILE_VERSION); EnableMenuItem(hSubMenu, CMD_Version, MF_GRAYED); AppendMenuW(hSubMenu, MF_STRING, CMD_ShowLicense, L"Licensed under GNU GPLv3 license"); AppendMenuW(hSubMenu, MF_SEPARATOR, 0, 0); AppendMenuW(hSubMenu, MF_STRING, CMD_ShowSource, L"Get source code"); AppendMenuW(m_contextMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, L"About"); }
/* * MainWindowHandleWMNotify * * Purpose: * * Main window WM_NOTIFY handler. * */ LRESULT MainWindowHandleWMNotify( _In_ HWND hwnd, _In_ WPARAM wParam, _In_ LPARAM lParam ) { INT c, k; LPNMHDR hdr = (LPNMHDR)lParam; LPTOOLTIPTEXT lpttt; LPNMLISTVIEW lvn; LPNMTREEVIEW lpnmTreeView; LPWSTR str; SIZE_T lcp; LVITEMW lvitem; LVCOLUMNW col; TVHITTESTINFO hti; POINT pt; WCHAR item_string[MAX_PATH + 1]; UNREFERENCED_PARAMETER(wParam); if (hdr) { if (hdr->hwndFrom == ObjectTree) { switch (hdr->code) { case TVN_ITEMEXPANDED: case TVN_SELCHANGED: SetFocus(ObjectTree); supSetWaitCursor(TRUE); MainWindowTreeViewSelChanged((LPNMTREEVIEWW)lParam); SendMessageW(StatusBar, WM_SETTEXT, 0, (LPARAM)CurrentObjectPath); g_enumParams.lpSubDirName = CurrentObjectPath; ListObjectsInDirectory(&g_enumParams); ListView_SortItemsEx(ObjectList, &MainWindowObjectListCompareFunc, SortColumn); supSetWaitCursor(FALSE); lpnmTreeView = (LPNMTREEVIEW)lParam; if (lpnmTreeView) { SelectedTreeItem = lpnmTreeView->itemNew.hItem; } break; case NM_RCLICK: GetCursorPos(&pt); hti.pt = pt; ScreenToClient(hdr->hwndFrom, &hti.pt); if (TreeView_HitTest(hdr->hwndFrom, &hti) && (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT))) { SelectedTreeItem = hti.hItem; if (hdr->code == NM_RCLICK) { TreeView_SelectItem(ObjectTree, SelectedTreeItem); SendMessageW(StatusBar, WM_SETTEXT, 0, (LPARAM)CurrentObjectPath); supHandleTreePopupMenu(hwnd, &pt); } } break; } } if (hdr->hwndFrom == ObjectList) { switch (hdr->code) { case NM_SETFOCUS: if (ListView_GetSelectionMark(ObjectList) == -1) { lvitem.mask = LVIF_STATE; lvitem.iItem = 0; lvitem.state = LVIS_SELECTED | LVIS_FOCUSED; lvitem.stateMask = LVIS_SELECTED | LVIS_FOCUSED; ListView_SetItem(ObjectList, &lvitem); } break; case LVN_ITEMCHANGED: lvn = (LPNMLISTVIEW)lParam; RtlSecureZeroMemory(&item_string, sizeof(item_string)); ListView_GetItemText(ObjectList, lvn->iItem, 0, item_string, MAX_PATH); lcp = _strlen(CurrentObjectPath); str = HeapAlloc(GetProcessHeap(), 0, (lcp + _strlen(item_string) + 4) * sizeof(WCHAR)); if (str == NULL) break; _strcpy(str, CurrentObjectPath); if ((str[0] == '\\') && (str[1] == 0)) { _strcpy(str + lcp, item_string); } else { str[lcp] = '\\'; _strcpy(str + lcp + 1, item_string); } SendMessageW(StatusBar, WM_SETTEXT, 0, (LPARAM)str); HeapFree(GetProcessHeap(), 0, str); break; //handle sort by column case LVN_COLUMNCLICK: bSortInverse = !bSortInverse; SortColumn = ((NMLISTVIEW *)lParam)->iSubItem; ListView_SortItemsEx(ObjectList, &MainWindowObjectListCompareFunc, SortColumn); RtlSecureZeroMemory(&col, sizeof(col)); col.mask = LVCF_IMAGE; col.iImage = -1; for (c = 0; c < 3; c++) ListView_SetColumn(ObjectList, c, &col); k = ImageList_GetImageCount(ListViewImages); if (bSortInverse) col.iImage = k - 2; else col.iImage = k - 1; ListView_SetColumn(ObjectList, ((NMLISTVIEW *)lParam)->iSubItem, &col); break; case NM_CLICK: c = ((LPNMITEMACTIVATE)lParam)->iItem; EnableMenuItem(GetSubMenu(GetMenu(hwnd), 2), ID_OBJECT_GOTOLINKTARGET, (supIsSymlink(c)) ? MF_BYCOMMAND : MF_BYCOMMAND | MF_GRAYED); break; case NM_DBLCLK: MainWindowHandleObjectListProp(hwnd); break; default: break; } } //handle tooltip if (hdr->code == TTN_GETDISPINFO) { lpttt = (LPTOOLTIPTEXT)lParam; switch (lpttt->hdr.idFrom) { case ID_OBJECT_PROPERTIES: case ID_VIEW_REFRESH: case ID_FIND_FINDOBJECT: lpttt->hinst = g_hInstance; lpttt->lpszText = MAKEINTRESOURCE(lpttt->hdr.idFrom); lpttt->uFlags |= TTF_DI_SETITEM; break; default: break; } } } return FALSE; }
static BOOL EnumerateServiceProviders(HKEY hKey, HWND hDlgCtrl, DIRECTPLAY_GUID * PreDefProviders) { DWORD dwIndex = 0; LONG result; WCHAR szName[50]; WCHAR szGUID[40]; WCHAR szTemp[63]; WCHAR szResult[MAX_PATH+20] = {0}; DWORD RegProviders = 0; DWORD ProviderIndex; DWORD dwName; LVITEMW Item; INT ItemCount; LRESULT lResult; ItemCount = ListView_GetItemCount(hDlgCtrl); ZeroMemory(&Item, sizeof(LVITEMW)); Item.mask = LVIF_TEXT; Item.pszText = szResult; Item.iItem = ItemCount; /* insert all predefined items first */ for(dwIndex = 0; dwIndex < 4; dwIndex++) { Item.iItem = ItemCount + dwIndex; Item.iSubItem = 0; szResult[0] = L'\0'; LoadStringW(hInst, PreDefProviders[dwIndex].ResourceID, szResult, sizeof(szResult)/sizeof(WCHAR)); szResult[(sizeof(szResult)/sizeof(WCHAR))-1] = L'\0'; Item.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEM, 0, (LPARAM)&Item); Item.iSubItem = 1; szResult[0] = L'\0'; LoadStringW(hInst, IDS_REG_FAIL, szResult, sizeof(szResult)/sizeof(WCHAR)); szResult[(sizeof(szResult)/sizeof(WCHAR))-1] = L'\0'; SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item); } dwIndex = 0; do { dwName = sizeof(szName) / sizeof(WCHAR); result = RegEnumKeyEx(hKey, dwIndex, szName, &dwName, NULL, NULL, NULL, NULL); if (result == ERROR_SUCCESS) { szName[(sizeof(szName)/sizeof(WCHAR))-1] = L'\0'; ProviderIndex = UINT_MAX; if (GetRegValue(hKey, szName, L"GUID", REG_SZ, szGUID, sizeof(szGUID))) ProviderIndex = FindProviderIndex(szGUID, PreDefProviders); if (ProviderIndex == UINT_MAX) { /* a custom service provider was found */ Item.iItem = ListView_GetItemCount(hDlgCtrl); /* FIXME * on Windows Vista we need to use RegLoadMUIString which is not available for older systems */ if (!GetRegValue(hKey, szName, L"Friendly Name", REG_SZ, szResult, sizeof(szResult))) if (!GetRegValue(hKey, szName, L"DescriptionW", REG_SZ, szResult, sizeof(szResult))) szResult[0] = L'\0'; /* insert the new provider */ Item.iSubItem = 0; lResult = SendMessageW(hDlgCtrl, LVM_INSERTITEM, 0, (LPARAM)&Item); /* adjust index */ ProviderIndex = lResult - ItemCount; } szResult[0] = L'\0'; /* check if the 'Path' key is available */ if (!GetRegValue(hKey, szName, L"Path", REG_SZ, szResult, sizeof(szResult))) { /* retrieve the path by lookup the CLSID */ wcscpy(szTemp, L"CLSID\\"); wcscpy(&szTemp[6], szGUID); wcscpy(&szTemp[44], L"\\InProcServer32"); if (!GetRegValue(HKEY_CLASSES_ROOT, szTemp, NULL, REG_SZ, szResult, sizeof(szResult))) { szResult[0] = L'\0'; ProviderIndex = UINT_MAX; } } if (szResult[0]) { /* insert path name */ Item.iSubItem = 2; Item.iItem = ProviderIndex + ItemCount; SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item); /* retrieve file version */ if (!GetFileVersion(szResult, szTemp, sizeof(szTemp)/sizeof(WCHAR))) { szTemp[0] = L'\0'; LoadStringW(hInst, IDS_VERSION_UNKNOWN, szTemp, sizeof(szTemp)/sizeof(WCHAR)); szTemp[(sizeof(szTemp)/sizeof(WCHAR))-1] = L'\0'; } Item.iSubItem = 3; Item.pszText = szTemp; SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item); Item.pszText = szResult; } if (ProviderIndex != UINT_MAX) { RegProviders |= (1 << ProviderIndex); szResult[0] = L'\0'; LoadStringW(hInst, IDS_REG_SUCCESS, szResult, sizeof(szResult)); Item.iSubItem = 1; Item.iItem = ProviderIndex + ItemCount; szResult[(sizeof(szResult)/sizeof(WCHAR))-1] = L'\0'; SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item); } } dwIndex++; }while(result != ERROR_NO_MORE_ITEMS); /* check if all providers have been registered */ // if (RegProviders == 15) return TRUE; return FALSE; }
/* * FindDlgProc * * Purpose: * * Find Dialog window procedure. * */ INT_PTR CALLBACK FindDlgProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { WCHAR search_string[MAX_PATH + 1], type_name[MAX_PATH + 1]; LPWSTR pnamestr = (LPWSTR)search_string, ptypestr = (LPWSTR)type_name; PFO_LIST_ITEM flist, plist; ULONG cci; LPNMLISTVIEW nhdr = (LPNMLISTVIEW)lParam; switch (uMsg) { case WM_NOTIFY: FindDlgHandleNotify(nhdr); break; case WM_GETMINMAXINFO: if (lParam) { ((PMINMAXINFO)lParam)->ptMinTrackSize.x = 548; ((PMINMAXINFO)lParam)->ptMinTrackSize.y = 230; } break; case WM_INITDIALOG: supCenterWindow(hwndDlg); FindDlgResize(hwndDlg); break; case WM_SIZE: FindDlgResize(hwndDlg); break; case WM_CLOSE: if (FindDlgGrip) DestroyWindow(FindDlgGrip); DestroyWindow(hwndDlg); FindDialog = NULL; g_wobjDialogs[WOBJ_FINDDLG_IDX] = NULL; return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL) { SendMessage(hwndDlg, WM_CLOSE, 0, 0); return TRUE; } if (LOWORD(wParam) == ID_SEARCH_FIND) { supSetWaitCursor(TRUE); EnableWindow(GetDlgItem(hwndDlg, ID_SEARCH_FIND), FALSE); ListView_DeleteAllItems(FindDlgList); RtlSecureZeroMemory(&search_string, sizeof(search_string)); RtlSecureZeroMemory(&type_name, sizeof(type_name)); SendMessageW(GetDlgItem(hwndDlg, ID_SEARCH_NAME), WM_GETTEXT, MAX_PATH, (LPARAM)&search_string); SendMessageW(GetDlgItem(hwndDlg, ID_SEARCH_TYPE), WM_GETTEXT, MAX_PATH, (LPARAM)&type_name); flist = NULL; if (search_string[0] == 0) pnamestr = NULL; if (type_name[0] == '*') ptypestr = 0; FindObject(L"\\", pnamestr, ptypestr, &flist); cci = 0; while (flist != NULL) { FindDlgAddListItem(FindDlgList, flist->ObjectName, flist->ObjectType); plist = flist->Prev; HeapFree(GetProcessHeap(), 0, flist); flist = plist; cci++; } ultostr(cci, search_string); _strcat(search_string, L" Object(s) found"); SendMessageW(GetDlgItem(hwndDlg, ID_SEARCH_GROUPBOX), WM_SETTEXT, 0, (LPARAM)search_string); ListView_SortItemsEx(FindDlgList, &FindDlgCompareFunc, FindDlgSortColumn); supSetWaitCursor(FALSE); EnableWindow(GetDlgItem(hwndDlg, ID_SEARCH_FIND), TRUE); } break; } return FALSE; }
int MyHideWindows() { NOTIFYICONDATA nid; if (bHideWindows == 1) { if (sOP.bDisableSound == 1) { CVolumeOutMaster OM; dwOldVolume = OM.GetCurrentVolume(); OM.SetCurrentVolume(0); CVolumeOutWave OW; dwOldWave = OW.GetCurrentVolume(); OW.SetCurrentVolume(0); //waveOutGetVolume(0,&dwOldVolume); //waveOutSetVolume(0,0); } EnableWindow(hAll,FALSE); EnableWindow(hLV,FALSE); for(int i1 = 0;i1<iBaSW_dll;i1++) { if(sW_dll[i1].bReserved != sOP.bReserveSel) { //ShowWindow(sW_dll[i1].hWnd,SW_HIDE); if(sOP.bHideProcess == 1) { HideProcess(sW_dll[i1].lPID); } sW_dll[i1].bHide = 1; sW_dll[i1].iLink = i1; // Use this member save thread handle index g_arrayHide[i1] = (HANDLE)_beginthreadex(NULL,0,HideWindowProc, sW_dll + i1,0,NULL); } } HANDLE hMonitorHandle = (HANDLE)_beginthreadex(NULL,0,MonitorProc, g_arrayHide,0,NULL); if(hMonitorHandle == INVALID_HANDLE_VALUE) { hMonitorHandle = NULL; } else { CloseHandle(hMonitorHandle); } if(sOP.bCleanAfterHide == 1) { g_pCleanHistory(); } if(sOP.bHideAllTray == 1) { AllocResourceForTrayList(); EnumAllVisibleTray_dll(); HideAllTray(); } dbview(L"enter sOP.bNeedStart == 1........................................"); if(sOP.bNeedStart == 1) { ShellExecute(NULL,L"open",sOP.cTrailRun,NULL,NULL,SW_SHOWNORMAL); } g_pClearTipText(); dbview(L"enter sOP.bUseMiddle........................................"); if(sOP.bUseMiddle) { g_pAppendTipText(L"IDS_USAGETIP_RECLICKMIDDLESHOWWINDOW", L"再按鼠标中键可以重新显示窗口。"); } else if(sOP.bUseMouse) { g_pAppendTipText(L"IDS_USAGETIP_RECLICKRIGHTLEFTSHOWWINDOW", L"再一齐按鼠标左右键可以重新显示窗口。"); } else { g_pAppendTipText(L"IDS_USAGETIP_REPRESSHOTKEYTOSHOWWINDOW", L"再按下 隐藏窗口 快捷键可以重新显示窗口。"); } if(sOP.bUseMiddle) { g_pSetTipText(L"IDS_USAGETIP_RECLICKMIDDLESHOWWINDOW", L"再按鼠标中键可以重新显示窗口。"); } else if(sOP.bUseMouse) { g_pSetTipText(L"IDS_USAGETIP_RECLICKRIGHTLEFTSHOWWINDOW", L"再一齐按鼠标左右键可以重新显示窗口。"); } else { g_pSetTipText(L"IDS_USAGETIP_REPRESSHOTKEYTOSHOWWINDOW", L"再按下 隐藏窗口 快捷键可以重新显示窗口。"); } dbview(L"enter bHideWindows = 0;........................................"); bHideWindows = 0; } else if (bHideWindows == 0) { if (sOP.bUsePassword == 1) { if(hDlg_Validate != NULL && IsWindow(hDlg_Validate)) { return 1; } if (DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG_VALIDATE),NULL,(DLGPROC)ValidateProc) == 0) { return 1; } } EnableWindow(hAll,TRUE); EnableWindow(hLV,TRUE); RestoreVolume(); //2.2 method /// for (int i = 0;i < iBaSW_dll;i++) { if(sOP.bHideProcess == 1) { ShowProcess(sW_dll[i].lPID); } ShowWindow(sW_dll[i].hWnd,SW_SHOW); if(sW_dll[i].iHasTrayIcon == 1 && sW_dll[i].bHide == 1) { nid.cbSize = sizeof(NOTIFYICONDATA); nid.uFlags = NIF_ICON|NIF_TIP|NIF_MESSAGE; nid.uID = sW_dll[i].trayicon.uID; nid.hIcon = sW_dll[i].trayicon.hIcon; nid.hWnd = sW_dll[i].trayicon.hwnd; wcscpy(nid.szTip,(const wchar_t *)sW_dll[i].cIconTip); nid.uCallbackMessage = sW_dll[i].trayicon.uCallbackMessage; // Shell_NotifyIcon(NIM_ADD,&nid); { int iCommandId = sW_dll[i].iCommandId; HWND g_TrayWnd = FindTrayToolbarWindow(); SendMessageW(g_TrayWnd,TB_HIDEBUTTON,WPARAM(iCommandId), (LPARAM)MAKELONG(FALSE,0)); NOTIFYICONDATA nid2; memset(&nid2,0,sizeof(nid2)); nid2.cbSize=sizeof(nid2); nid2.hWnd=nid.hWnd; nid2.uID=nid.uID; nid2.uFlags=NIF_STATE; nid2.dwState=NIS_HIDDEN; ::SendMessage(g_TrayWnd,WM_SETREDRAW,(WPARAM)FALSE,0); Shell_NotifyIcon(NIM_MODIFY,&nid2); SendMessage(g_TrayWnd,WM_SETREDRAW,(WPARAM)TRUE,0); } // HANDLE hHideWndHandle = (HANDLE)_beginthreadex(NULL,0,HideWindowProc,sW_dll + i1,0,NULL); // if(hHideWndHandle == INVALID_HANDLE_VALUE) // { // g_arrayHide[i1] = NULL; // } // else // { // g_arrayHide[i1] = hHideWndHandle; // } } sW_dll[i].bHide = 0; } if(sOP.bAutoHide_QH == 1 && iBaSW_QH > 0) { for(i = 0;i < iBaSW_QH;i++) { ShowWindow(pArr_dll[i],SW_SHOW); } iBaSW_QH = 0; } if(sOP.bHideAllTray == 1) { ShowAllTray(); ReleaseResourceForTrayList_dll(); } bHideWindows = 1; g_pClearTipText(); if(sOP.bUseMiddle) { g_pAppendTipText(L"IDS_USAGETIP_CLICKMIDDLEHIDEWND", L"按鼠标中键可以隐藏窗口。"); } else if(sOP.bUseMouse) { g_pAppendTipText(L"IDS_USAGETIP_CLICKLEFTRIGHTHIDEWND", L"一齐按下鼠标左右键可以隐藏窗口。"); } else { g_pAppendTipText(L"IDS_USAGETIP_PRESSHOTKEYTOHIDEWINDOW", L"按下 隐藏窗口 的快捷键,即可隐藏窗口。"); } if(sOP.bReserveSel) { g_pAppendTipText(L"IDS_USAGETIP_SELWNDLISTCANRESERVEWND", L"您还可以在下边窗口列表里选择不想隐藏的窗口。"); } else { g_pAppendTipText(L"IDS_USAGETIP_HIDESELITEM", L"在 窗口列表 里被选择的窗口将被隐藏。"); } if(sOP.bUseMiddle) { g_pSetTipText(L"IDS_USAGETIP_CLICKMIDDLEHIDEWND", L"按鼠标中键可以隐藏窗口。"); } else if(sOP.bUseMouse) { g_pSetTipText(L"IDS_USAGETIP_CLICKLEFTRIGHTHIDEWND", L"一齐按下鼠标左右键可以隐藏窗口。"); } else { g_pSetTipText(L"IDS_USAGETIP_PRESSHOTKEYTOHIDEWINDOW", L"按下 隐藏窗口 的快捷键,即可隐藏窗口。"); } iHideComplete = 1; } return 1; }
UINT WINAPI WinPosGetMinMaxInfo(HWND hwnd, POINT* maxSize, POINT* maxPos, POINT* minTrack, POINT* maxTrack) { MINMAXINFO MinMax; HMONITOR monitor; INT xinc, yinc; LONG style = GetWindowLongW( hwnd, GWL_STYLE ); LONG adjustedStyle; LONG exstyle = GetWindowLongW( hwnd, GWL_EXSTYLE ); RECT rc; WND *win; /* Compute default values */ GetWindowRect(hwnd, &rc); MinMax.ptReserved.x = rc.left; MinMax.ptReserved.y = rc.top; if ((style & WS_CAPTION) == WS_CAPTION) adjustedStyle = style & ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */ else adjustedStyle = style; GetClientRect(GetAncestor(hwnd,GA_PARENT), &rc); AdjustWindowRectEx(&rc, adjustedStyle, ((style & WS_POPUP) && GetMenu(hwnd)), exstyle); xinc = -rc.left; yinc = -rc.top; MinMax.ptMaxSize.x = rc.right - rc.left; MinMax.ptMaxSize.y = rc.bottom - rc.top; if (style & (WS_DLGFRAME | WS_BORDER)) { MinMax.ptMinTrackSize.x = GetSystemMetrics(SM_CXMINTRACK); MinMax.ptMinTrackSize.y = GetSystemMetrics(SM_CYMINTRACK); } else { MinMax.ptMinTrackSize.x = 2 * xinc; MinMax.ptMinTrackSize.y = 2 * yinc; } MinMax.ptMaxTrackSize.x = GetSystemMetrics(SM_CXMAXTRACK); MinMax.ptMaxTrackSize.y = GetSystemMetrics(SM_CYMAXTRACK); MinMax.ptMaxPosition.x = -xinc; MinMax.ptMaxPosition.y = -yinc; if ((win = ValidateHwnd( hwnd )) )//&& win != WND_DESKTOP && win != WND_OTHER_PROCESS) { if (!EMPTYPOINT(win->InternalPos.MaxPos)) MinMax.ptMaxPosition = win->InternalPos.MaxPos; } SendMessageW( hwnd, WM_GETMINMAXINFO, 0, (LPARAM)&MinMax ); /* if the app didn't change the values, adapt them for the current monitor */ if ((monitor = MonitorFromWindow( hwnd, MONITOR_DEFAULTTOPRIMARY ))) { RECT rc_work; MONITORINFO mon_info; mon_info.cbSize = sizeof(mon_info); GetMonitorInfoW( monitor, &mon_info ); rc_work = mon_info.rcMonitor; if (style & WS_MAXIMIZEBOX) { if ((style & WS_CAPTION) == WS_CAPTION || !(style & (WS_CHILD | WS_POPUP))) rc_work = mon_info.rcWork; } if (MinMax.ptMaxSize.x == GetSystemMetrics(SM_CXSCREEN) + 2 * xinc && MinMax.ptMaxSize.y == GetSystemMetrics(SM_CYSCREEN) + 2 * yinc) { MinMax.ptMaxSize.x = (rc_work.right - rc_work.left) + 2 * xinc; MinMax.ptMaxSize.y = (rc_work.bottom - rc_work.top) + 2 * yinc; } if (MinMax.ptMaxPosition.x == -xinc && MinMax.ptMaxPosition.y == -yinc) { MinMax.ptMaxPosition.x = rc_work.left - xinc; MinMax.ptMaxPosition.y = rc_work.top - yinc; } } /* Some sanity checks */ TRACE("%d %d / %d %d / %d %d / %d %d\n", MinMax.ptMaxSize.x, MinMax.ptMaxSize.y, MinMax.ptMaxPosition.x, MinMax.ptMaxPosition.y, MinMax.ptMaxTrackSize.x, MinMax.ptMaxTrackSize.y, MinMax.ptMinTrackSize.x, MinMax.ptMinTrackSize.y); MinMax.ptMaxTrackSize.x = max( MinMax.ptMaxTrackSize.x, MinMax.ptMinTrackSize.x ); MinMax.ptMaxTrackSize.y = max( MinMax.ptMaxTrackSize.y, MinMax.ptMinTrackSize.y ); if (maxSize) *maxSize = MinMax.ptMaxSize; if (maxPos) *maxPos = MinMax.ptMaxPosition; if (minTrack) *minTrack = MinMax.ptMinTrackSize; if (maxTrack) *maxTrack = MinMax.ptMaxTrackSize; return 0; //FIXME: what does it return? Wine returns MINMAXINFO. }
DWORD WINAPI PerformancePageRefreshThread(void *lpParameter) { ULONGLONG CommitChargeTotal; ULONGLONG CommitChargeLimit; ULONGLONG CommitChargePeak; ULONG CpuUsage; ULONG CpuKernelUsage; ULONGLONG KernelMemoryTotal; ULONGLONG KernelMemoryPaged; ULONGLONG KernelMemoryNonPaged; ULONGLONG PhysicalMemoryTotal; ULONGLONG PhysicalMemoryAvailable; ULONGLONG PhysicalMemorySystemCache; ULONG TotalHandles; ULONG TotalThreads; ULONG TotalProcesses; WCHAR Text[260]; WCHAR szMemUsage[256]; MSG msg; LoadStringW(hInst, IDS_STATUS_MEMUSAGE, szMemUsage, 256); while (1) { int nBarsUsed1; int nBarsUsed2; WCHAR szChargeTotalFormat[256]; WCHAR szChargeLimitFormat[256]; /* Wait for an the event or application close */ if (GetMessage(&msg, NULL, 0, 0) <= 0) return 0; if (msg.message == WM_TIMER) { /* * Update the commit charge info */ CommitChargeTotal = PerfDataGetCommitChargeTotalK(); CommitChargeLimit = PerfDataGetCommitChargeLimitK(); CommitChargePeak = PerfDataGetCommitChargePeakK(); _ultow(CommitChargeTotal, Text, 10); SetWindowTextW(hPerformancePageCommitChargeTotalEdit, Text); _ultow(CommitChargeLimit, Text, 10); SetWindowTextW(hPerformancePageCommitChargeLimitEdit, Text); _ultow(CommitChargePeak, Text, 10); SetWindowTextW(hPerformancePageCommitChargePeakEdit, Text); StrFormatByteSizeW(CommitChargeTotal * 1024, szChargeTotalFormat, sizeof(szChargeTotalFormat)); StrFormatByteSizeW(CommitChargeLimit * 1024, szChargeLimitFormat, sizeof(szChargeLimitFormat)); wsprintfW(Text, szMemUsage, szChargeTotalFormat, szChargeLimitFormat, (CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0)); SendMessageW(hStatusWnd, SB_SETTEXT, 2, (LPARAM)Text); /* * Update the kernel memory info */ KernelMemoryTotal = PerfDataGetKernelMemoryTotalK(); KernelMemoryPaged = PerfDataGetKernelMemoryPagedK(); KernelMemoryNonPaged = PerfDataGetKernelMemoryNonPagedK(); _ultow(KernelMemoryTotal, Text, 10); SetWindowTextW(hPerformancePageKernelMemoryTotalEdit, Text); _ultow(KernelMemoryPaged, Text, 10); SetWindowTextW(hPerformancePageKernelMemoryPagedEdit, Text); _ultow(KernelMemoryNonPaged, Text, 10); SetWindowTextW(hPerformancePageKernelMemoryNonPagedEdit, Text); /* * Update the physical memory info */ PhysicalMemoryTotal = PerfDataGetPhysicalMemoryTotalK(); PhysicalMemoryAvailable = PerfDataGetPhysicalMemoryAvailableK(); PhysicalMemorySystemCache = PerfDataGetPhysicalMemorySystemCacheK(); _ultow(PhysicalMemoryTotal, Text, 10); SetWindowTextW(hPerformancePagePhysicalMemoryTotalEdit, Text); _ultow(PhysicalMemoryAvailable, Text, 10); SetWindowTextW(hPerformancePagePhysicalMemoryAvailableEdit, Text); _ultow(PhysicalMemorySystemCache, Text, 10); SetWindowTextW(hPerformancePagePhysicalMemorySystemCacheEdit, Text); /* * Update the totals info */ TotalHandles = PerfDataGetSystemHandleCount(); TotalThreads = PerfDataGetTotalThreadCount(); TotalProcesses = PerfDataGetProcessCount(); _ultow(TotalHandles, Text, 10); SetWindowTextW(hPerformancePageTotalsHandleCountEdit, Text); _ultow(TotalThreads, Text, 10); SetWindowTextW(hPerformancePageTotalsThreadCountEdit, Text); _ultow(TotalProcesses, Text, 10); SetWindowTextW(hPerformancePageTotalsProcessCountEdit, Text); /* * Redraw the graphs */ InvalidateRect(hPerformancePageCpuUsageGraph, NULL, FALSE); InvalidateRect(hPerformancePageMemUsageGraph, NULL, FALSE); /* * Get the CPU usage */ CpuUsage = PerfDataGetProcessorUsage(); if (CpuUsage <= 0 ) CpuUsage = 0; if (CpuUsage > 100) CpuUsage = 100; if (TaskManagerSettings.ShowKernelTimes) { CpuKernelUsage = PerfDataGetProcessorSystemUsage(); if (CpuKernelUsage <= 0) CpuKernelUsage = 0; if (CpuKernelUsage > 100) CpuKernelUsage = 100; } else { CpuKernelUsage = 0; } /* * Get the memory usage */ CommitChargeTotal = PerfDataGetCommitChargeTotalK(); CommitChargeLimit = PerfDataGetCommitChargeLimitK(); nBarsUsed1 = CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0; PhysicalMemoryTotal = PerfDataGetPhysicalMemoryTotalK(); PhysicalMemoryAvailable = PerfDataGetPhysicalMemoryAvailableK(); nBarsUsed2 = PhysicalMemoryTotal ? ((PhysicalMemoryAvailable * 100) / PhysicalMemoryTotal) : 0; GraphCtrl_AppendPoint(&PerformancePageCpuUsageHistoryGraph, CpuUsage, CpuKernelUsage, 0.0, 0.0); GraphCtrl_AppendPoint(&PerformancePageMemUsageHistoryGraph, nBarsUsed1, nBarsUsed2, 0.0, 0.0); /* PerformancePageMemUsageHistoryGraph.SetRange(0.0, 100.0, 10) ; */ InvalidateRect(hPerformancePageMemUsageHistoryGraph, NULL, FALSE); InvalidateRect(hPerformancePageCpuUsageHistoryGraph, NULL, FALSE); } } return 0; }
static BOOL STATUSBAR_SetParts (STATUS_INFO *infoPtr, INT count, LPINT parts) { STATUSWINDOWPART *tmp; INT i, oldNumParts; TRACE("(%d,%p)\n", count, parts); if(!count) return FALSE; oldNumParts = infoPtr->numParts; infoPtr->numParts = count; if (oldNumParts > infoPtr->numParts) { for (i = infoPtr->numParts ; i < oldNumParts; i++) { if (!(infoPtr->parts[i].style & SBT_OWNERDRAW)) Free (infoPtr->parts[i].text); } } else if (oldNumParts < infoPtr->numParts) { tmp = Alloc (sizeof(STATUSWINDOWPART) * infoPtr->numParts); if (!tmp) return FALSE; for (i = 0; i < oldNumParts; i++) { tmp[i] = infoPtr->parts[i]; } Free (infoPtr->parts); infoPtr->parts = tmp; } if (oldNumParts == infoPtr->numParts) { for (i=0; i < oldNumParts; i++) if (infoPtr->parts[i].x != parts[i]) break; if (i==oldNumParts) /* Unchanged? no need to redraw! */ return TRUE; } for (i = 0; i < infoPtr->numParts; i++) infoPtr->parts[i].x = parts[i]; if (infoPtr->hwndToolTip) { INT nTipCount; TTTOOLINFOW ti; WCHAR wEmpty = 0; ZeroMemory (&ti, sizeof(TTTOOLINFOW)); ti.cbSize = sizeof(TTTOOLINFOW); ti.hwnd = infoPtr->Self; ti.lpszText = &wEmpty; nTipCount = SendMessageW (infoPtr->hwndToolTip, TTM_GETTOOLCOUNT, 0, 0); if (nTipCount < infoPtr->numParts) { /* add tools */ for (i = nTipCount; i < infoPtr->numParts; i++) { TRACE("add tool %d\n", i); ti.uId = i; SendMessageW (infoPtr->hwndToolTip, TTM_ADDTOOLW, 0, (LPARAM)&ti); } } else if (nTipCount > infoPtr->numParts) { /* delete tools */ for (i = nTipCount - 1; i >= infoPtr->numParts; i--) { TRACE("delete tool %d\n", i); ti.uId = i; SendMessageW (infoPtr->hwndToolTip, TTM_DELTOOLW, 0, (LPARAM)&ti); } } } STATUSBAR_SetPartBounds (infoPtr); InvalidateRect(infoPtr->Self, NULL, FALSE); return TRUE; }
/** Fills the list of contacts * * @param chg : Structure holding all the change info (See CHANGES). */ void FillContactList(HWND hWndDlg, CHANGES *chg) { HWND hList = GetDlgItem(hWndDlg, IDC_LST_CONTACTS); char *proto, *field, buff[256]; int i; LVITEM LvItem; DBVARIANT dbv; LVITEMW LvItemW; // for unicode nicks SendMessage(hList,LVM_DELETEALLITEMS,0,0); ZeroMemory(&LvItem, sizeof(LvItem)); LvItem.mask=LVIF_TEXT; // Text Style LvItem.cchTextMax = 256; // Max size of test ZeroMemory(&LvItemW, sizeof(LvItemW)); LvItemW.mask=LVIF_TEXT; // Text Style LvItemW.cchTextMax = 256; // Max size of test for(i = 0; i < chg->num_contacts; i++) { LvItem.iItem = i; LvItemW.iItem = i; { char *szCDN = (char *) CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)chg->hContact[i], 0); if(os_unicode_enabled) { wchar_t *swzCDN = (wchar_t *) CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)chg->hContact[i], GCDNF_UNICODE), *swzContactDisplayName; LvItemW.iSubItem = 0; // clist display name // detect if the clist provided unicode display name by comparing with non-unicode if(szCDN && swzCDN && strncmp(szCDN, (char *)swzCDN, strlen(szCDN)) != 0 && wcslen(swzCDN) >= strlen(szCDN)) { swzContactDisplayName = swzCDN; } else { // no? convert to unicode if(szCDN) { swzContactDisplayName = (wchar_t *) _malloca(sizeof(wchar_t) * (strlen(szCDN) + 1)); MultiByteToWideChar(CP_ACP, 0, (char *) szCDN, -1, swzContactDisplayName, (int)strlen((char *)szCDN) + 1); } else { swzContactDisplayName = TranslateW(L"(Unknown Contact)"); } } LvItemW.pszText = swzContactDisplayName; SendMessageW(hList, LVM_INSERTITEMW, (WPARAM)0, (LPARAM)&LvItemW); } else { LvItem.iSubItem = 0; // clist display name LvItem.pszText = szCDN; SendMessage(hList, LVM_INSERTITEM, (WPARAM)0, (LPARAM)&LvItem); } } LvItem.iSubItem = 1; // id proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)chg->hContact[i], 0); if(proto) { field = (char *)CallProtoService(proto,PS_GETCAPS,PFLAG_UNIQUEIDSETTING,0); DBGetContactSetting(chg->hContact[i],proto,field,&dbv); switch(dbv.type) { case DBVT_ASCIIZ: sprintf(buff,"%s",dbv.pszVal); break; case DBVT_BYTE: sprintf(buff,"%d",dbv.bVal); break; case DBVT_WORD: sprintf(buff,"%d",dbv.wVal); break; case DBVT_DWORD: sprintf(buff,"%d",(int)dbv.dVal); break; default: //sprintf(buff,""); buff[0] = 0; } DBFreeVariant(&dbv); LvItem.pszText = buff; SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems LvItem.iSubItem = 2; // protocol LvItem.pszText = proto; SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems } else { LvItem.pszText = "Unknown"; SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems LvItem.iSubItem = 2; // protocol LvItem.pszText = "Unknown"; SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems } LvItem.iSubItem = 3; // Default (Yes/No) LvItem.pszText = (chg->hContact[i] == chg->hDefaultContact ? Translate("Yes") : Translate("No")); SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems LvItem.iSubItem = 4; // Offline (Yes/No) LvItem.pszText = (chg->hContact[i] == chg->hOfflineContact ? Translate("Yes") : Translate("No")); SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems } }
static LRESULT STATUSBAR_WMCreate (HWND hwnd, const CREATESTRUCTA *lpCreate) { STATUS_INFO *infoPtr; NONCLIENTMETRICSW nclm; DWORD dwStyle; RECT rect; int len; TRACE("\n"); infoPtr = Alloc (sizeof(STATUS_INFO)); if (!infoPtr) goto create_fail; SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr); infoPtr->Self = hwnd; infoPtr->Notify = lpCreate->hwndParent; infoPtr->numParts = 1; infoPtr->parts = 0; infoPtr->simple = FALSE; infoPtr->clrBk = CLR_DEFAULT; infoPtr->hFont = 0; infoPtr->horizontalBorder = HORZ_BORDER; infoPtr->verticalBorder = VERT_BORDER; infoPtr->horizontalGap = HORZ_GAP; infoPtr->minHeight = GetSystemMetrics(SM_CYSIZE); if (infoPtr->minHeight & 1) infoPtr->minHeight--; STATUSBAR_NotifyFormat(infoPtr, infoPtr->Notify, NF_REQUERY); ZeroMemory (&nclm, sizeof(nclm)); nclm.cbSize = sizeof(nclm); SystemParametersInfoW (SPI_GETNONCLIENTMETRICS, nclm.cbSize, &nclm, 0); infoPtr->hDefaultFont = CreateFontIndirectW (&nclm.lfStatusFont); GetClientRect (hwnd, &rect); /* initialize simple case */ infoPtr->part0.bound = rect; infoPtr->part0.text = 0; infoPtr->part0.x = 0; infoPtr->part0.style = 0; infoPtr->part0.hIcon = 0; /* initialize first part */ infoPtr->parts = Alloc (sizeof(STATUSWINDOWPART)); if (!infoPtr->parts) goto create_fail; infoPtr->parts[0].bound = rect; infoPtr->parts[0].text = 0; infoPtr->parts[0].x = -1; infoPtr->parts[0].style = 0; infoPtr->parts[0].hIcon = 0; OpenThemeData (hwnd, themeClass); if (lpCreate->lpszName && (len = strlenW ((LPCWSTR)lpCreate->lpszName))) { infoPtr->parts[0].text = Alloc ((len + 1)*sizeof(WCHAR)); if (!infoPtr->parts[0].text) goto create_fail; strcpyW (infoPtr->parts[0].text, (LPCWSTR)lpCreate->lpszName); } dwStyle = GetWindowLongW (hwnd, GWL_STYLE); /* native seems to clear WS_BORDER, too */ dwStyle &= ~WS_BORDER; SetWindowLongW (hwnd, GWL_STYLE, dwStyle); infoPtr->height = STATUSBAR_ComputeHeight(infoPtr); if (dwStyle & SBT_TOOLTIPS) { infoPtr->hwndToolTip = CreateWindowExW (0, TOOLTIPS_CLASSW, NULL, WS_POPUP | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, 0, (HINSTANCE)GetWindowLongPtrW(hwnd, GWLP_HINSTANCE), NULL); if (infoPtr->hwndToolTip) { NMTOOLTIPSCREATED nmttc; nmttc.hdr.hwndFrom = hwnd; nmttc.hdr.idFrom = GetWindowLongPtrW (hwnd, GWLP_ID); nmttc.hdr.code = NM_TOOLTIPSCREATED; nmttc.hwndToolTips = infoPtr->hwndToolTip; SendMessageW (lpCreate->hwndParent, WM_NOTIFY, nmttc.hdr.idFrom, (LPARAM)&nmttc); } } return 0; create_fail: TRACE(" failed!\n"); if (infoPtr) STATUSBAR_WMDestroy(infoPtr); return -1; }
// TODO alter this so that only the visible columns are redrawn // TODO this means rename controlSize to clientRect static void drawItem(struct table *t, HDC dc, intptr_t i, LONG y, LONG height, RECT controlSize) { RECT rsel; HBRUSH background; int textColor; WCHAR msg[100]; RECT headeritem; intptr_t j; LRESULT xoff; IMAGELISTDRAWPARAMS ip; // TODO verify these two background = (HBRUSH) (COLOR_WINDOW + 1); textColor = COLOR_WINDOWTEXT; if (t->selected == i) { // these are the colors wine uses (http://source.winehq.org/source/dlls/comctl32/listview.c) // the two for unfocused are also suggested by http://stackoverflow.com/questions/10428710/windows-forms-inactive-highlight-color background = (HBRUSH) (COLOR_HIGHLIGHT + 1); textColor = COLOR_HIGHLIGHTTEXT; if (GetFocus() != t->hwnd) { background = (HBRUSH) (COLOR_BTNFACE + 1); textColor = COLOR_BTNTEXT; } } // first fill the selection rect // note that this already only draws the visible area rsel.left = controlSize.left; rsel.top = y; rsel.right = controlSize.right - controlSize.left; rsel.bottom = y + height; if (FillRect(dc, &rsel, background) == 0) abort(); xoff = SendMessageW(t->header, HDM_GETBITMAPMARGIN, 0, 0); // now adjust for horizontal scrolling xoff -= t->hpos; // now draw the cells if (SetTextColor(dc, GetSysColor(textColor)) == CLR_INVALID) abort(); if (SetBkMode(dc, TRANSPARENT) == 0) abort(); for (j = 0; j < t->nColumns; j++) { if (SendMessageW(t->header, HDM_GETITEMRECT, (WPARAM) j, (LPARAM) (&headeritem)) == 0) abort(); switch (t->columnTypes[j]) { case tableColumnText: rsel.left = headeritem.left + xoff; rsel.top = y; rsel.right = headeritem.right; rsel.bottom = y + height; // TODO vertical center in case the height is less than the icon height? if (DrawTextExW(dc, msg, wsprintf(msg, L"Item %d", i), &rsel, DT_END_ELLIPSIS | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE, NULL) == 0) abort(); break; case tableColumnImage: // TODO vertically center if image is smaller than text height // TODO same for checkboxes ZeroMemory(&ip, sizeof (IMAGELISTDRAWPARAMS)); ip.cbSize = sizeof (IMAGELISTDRAWPARAMS); ip.himl = t->checkboxes;//t->imagelist; ip.i = (i%8);//0; ip.hdcDst = dc; ip.x = headeritem.left + xoff; ip.y = y; ip.cx = 0; // draw whole image ip.cy = 0; ip.xBitmap = 0; ip.yBitmap = 0; ip.rgbBk = CLR_NONE; ip.fStyle = ILD_NORMAL | ILD_SCALE; // TODO alpha-blend; ILD_DPISCALE? // TODO ILS_ALPHA? if (ImageList_DrawIndirect(&ip) == 0) abort(); break; case tableColumnCheckbox: // TODO replace all this rsel.left = headeritem.left + xoff; rsel.top = y; rsel.right = rsel.left + t->checkboxWidth; rsel.bottom = rsel.top + t->checkboxHeight; if (SetDCBrushColor(dc, RGB(255, 0, 0)) == CLR_INVALID) abort(); if (FillRect(dc, &rsel, GetStockObject(DC_BRUSH)) == 0) abort(); break; } if (t->selected == i && t->focusedColumn == j) { rsel.left = headeritem.left; rsel.top = y; rsel.right = headeritem.right; rsel.bottom = y + height; if (DrawFocusRect(dc, &rsel) == 0) abort(); } } }
LRESULT MusPlayer_WinAPI::MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_HSCROLL: { if(m_self->m_volume == (HWND)lParam) { switch(LOWORD(wParam)) { case TB_ENDTRACK: case TB_THUMBPOSITION: case TB_THUMBTRACK: case SB_LEFT: case SB_RIGHT: DWORD dwPos;// current position of slider dwPos = SendMessageW(m_self->m_volume, TBM_GETPOS, 0, 0); SendMessageW(m_self->m_volume, TBM_SETPOS, (WPARAM)TRUE, //redraw flag (LPARAM)dwPos); m_self->on_volume_valueChanged(dwPos); break; default: break; } } break; } case WM_COMMAND: { switch(HIWORD(wParam)) { case BN_CLICKED: { switch( LOWORD(wParam) ) { case CMD_Open: m_self->on_open_clicked(); break; case CMD_Play: m_self->on_play_clicked(); break; case CMD_Stop: m_self->on_stop_clicked(); break; case CMD_SetDefault: m_self->on_resetDefaultADLMIDI_clicked(); break; case CMD_RecordWave: { BOOL checked = IsDlgButtonChecked(hWnd, CMD_RecordWave); if (checked) { CheckDlgButton(hWnd, CMD_RecordWave, BST_UNCHECKED); m_self->on_recordWav_clicked(false); } else { CheckDlgButton(hWnd, CMD_RecordWave, BST_CHECKED); m_self->on_recordWav_clicked(true); } break; } case CMD_Reverb: { if (PGE_MusicPlayer::reverbEnabled) { CheckMenuItem(m_self->m_contextMenu, CMD_Reverb, MF_UNCHECKED); Mix_UnregisterEffect(MIX_CHANNEL_POST, reverbEffect); PGE_MusicPlayer::reverbEnabled = false; } else { CheckMenuItem(m_self->m_contextMenu, CMD_Reverb, MF_CHECKED); Mix_RegisterEffect(MIX_CHANNEL_POST, reverbEffect, reverbEffectDone, NULL); PGE_MusicPlayer::reverbEnabled = true; } break; } case CMD_ShowLicense: { ShellExecuteW(0, 0, L"http://www.gnu.org/licenses/gpl", 0, 0 , SW_SHOW); break; } case CMD_ShowSource: { ShellExecuteW(0, 0, L"https://github.com/WohlSoft/PGE-Project", 0, 0 , SW_SHOW); break; } default: break; } break; } } break; } case WM_DROPFILES: { HDROP hDropInfo = (HDROP)wParam; wchar_t sItem[MAX_PATH]; memset(sItem, 0, MAX_PATH*sizeof(wchar_t)); if(DragQueryFileW(hDropInfo, 0, (LPWSTR)sItem, sizeof(sItem))) { m_self->openMusicByArg(Wstr2Str(sItem)); } DragFinish(hDropInfo); break; } case WM_CONTEXTMENU: { SetForegroundWindow(hWnd); TrackPopupMenu(m_self->m_contextMenu,TPM_RIGHTBUTTON|TPM_TOPALIGN|TPM_LEFTALIGN, LOWORD( lParam ), HIWORD( lParam ), 0, hWnd, NULL); break; } //Инфо о минимальном и максимальном размере окна case WM_GETMINMAXINFO: { MINMAXINFO *minMax = (MINMAXINFO*)lParam; minMax->ptMinTrackSize.x = 350; minMax->ptMinTrackSize.y = m_self->m_height; break; } case WM_CREATE: { m_self->initUI(hWnd); break; } //Окно было закрыто case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, msg, wParam, lParam); }
INT_PTR CALLBACK NSudoDlgCallBack(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hUserName = GetDlgItem(hDlg, IDC_UserName); HWND hTokenPrivilege = GetDlgItem(hDlg, IDC_TokenPrivilege); HWND hMandatoryLabel = GetDlgItem(hDlg, IDC_MandatoryLabel); HWND hszPath = GetDlgItem(hDlg, IDC_szPath); wchar_t szCMDLine[260], szUser[260], szPrivilege[260], szMandatory[260], szBuffer[260]; switch (message) { case WM_INITDIALOG: // Show NSudo Logo SendMessageW( GetDlgItem(hDlg, IDC_NSudoLogo), STM_SETIMAGE, IMAGE_ICON, LPARAM(LoadImageW(GetModuleHandleW(NULL), MAKEINTRESOURCE(IDI_NSUDO), IMAGE_ICON, 0, 0, LR_COPYFROMRESOURCE))); //Show Warning Icon SendMessageW( GetDlgItem(hDlg, IDC_Icon), STM_SETIMAGE, IMAGE_ICON, LPARAM(LoadIconW(NULL, IDI_WARNING))); SendMessageW(hUserName, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_TI); SendMessageW(hUserName, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_Sys); SendMessageW(hUserName, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_CP); SendMessageW(hUserName, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_CU); SendMessageW(hUserName, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_CPD); SendMessageW(hUserName, CB_SETCURSEL, 4, 0); //设置默认项"TrustedInstaller" SendMessageW(hTokenPrivilege, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_Default); SendMessageW(hTokenPrivilege, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_EnableAll); SendMessageW(hTokenPrivilege, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_DisableAll); SendMessageW(hTokenPrivilege, CB_SETCURSEL, 2, 0); //设置默认项"默认" SendMessageW(hMandatoryLabel, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_Low); SendMessageW(hMandatoryLabel, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_Medium); SendMessageW(hMandatoryLabel, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_High); SendMessageW(hMandatoryLabel, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_System); SendMessageW(hMandatoryLabel, CB_INSERTSTRING, 0, (LPARAM)TextRes.NSudo_Text_Default); SendMessageW(hMandatoryLabel, CB_SETCURSEL, 0, 0); //设置默认项"默认" { wchar_t szItem[260], szBuffer[32768]; DWORD dwLength = GetPrivateProfileSectionNamesW(szBuffer, 32768, szShortCutListPath); for (DWORD i = 0, j = 0; i < dwLength; i++,j++) { if (szBuffer[i] != NULL) { szItem[j] = szBuffer[i]; } else { szItem[j] = NULL; SendMessageW(hszPath, CB_INSERTSTRING, 0, (LPARAM)szItem); j=-1; } } } return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_Run: GetDlgItemTextW(hDlg, IDC_UserName, szUser, sizeof(szUser)); GetDlgItemTextW(hDlg, IDC_TokenPrivilege, szPrivilege, sizeof(szPrivilege)); GetDlgItemTextW(hDlg, IDC_MandatoryLabel, szMandatory, sizeof(szMandatory)); GetDlgItemTextW(hDlg, IDC_szPath, szCMDLine, sizeof(szCMDLine)); NSudo_Run(hDlg,szUser, szPrivilege, szMandatory, szCMDLine); break; case IDC_About: NSudoReturnMessage(TextRes.NSudo_AboutText); break; case IDC_Browse: wcscpy_s(szBuffer, 260, L""); NSudoBrowseDialog(hDlg, szBuffer); SetDlgItemTextW(hDlg, IDC_szPath, szBuffer); break; } break; case WM_SYSCOMMAND: switch (LOWORD(wParam)) { case SC_CLOSE: PostQuitMessage(0); break; } break; } return 0; }
static void test_ITextDocument_Open(void) { IRichEditOle *reOle = NULL; ITextDocument *txtDoc = NULL; ITextSelection *txtSel = NULL; HRESULT hres; HWND w; HANDLE hFile; VARIANT testfile; WCHAR filename[] = {'t', 'e', 's', 't','.','t','x','t', 0}; int result; DWORD dw; static const CHAR chACP[] = "TestSomeText"; static const CHAR chUTF8[] = "\xef\xbb\xbfTextWithUTF8BOM"; static const WCHAR chUTF16[] = {0xfeff, 'T', 'e', 's', 't', 'S', 'o', 'm', 'e', 'T', 'e', 'x', 't', 0}; #define MAX_BUF_LEN 1024 CHAR bufACP[MAX_BUF_LEN]; WCHAR bufUnicode[MAX_BUF_LEN]; static const int tomConstantsSingle[] = { tomReadOnly, tomShareDenyRead, tomShareDenyWrite, tomCreateAlways, tomOpenExisting, tomOpenAlways, tomTruncateExisting, tomRTF, tomText }; static const int tomConstantsMulti[] = { tomReadOnly|tomShareDenyRead|tomPasteFile, tomReadOnly|tomPasteFile, tomReadOnly|tomShareDenyWrite|tomPasteFile, tomReadOnly|tomShareDenyRead|tomShareDenyWrite|tomPasteFile, tomShareDenyWrite|tomPasteFile, tomShareDenyRead|tomShareDenyWrite|tomPasteFile, tomShareDenyRead|tomPasteFile, tomShareDenyRead|tomShareDenyWrite, tomReadOnly|tomShareDenyRead|tomShareDenyWrite, tomReadOnly|tomShareDenyWrite, tomReadOnly|tomShareDenyRead }; int tomNumSingle = sizeof(tomConstantsSingle)/sizeof(tomConstantsSingle[0]); int tomNumMulti = sizeof(tomConstantsMulti)/sizeof(tomConstantsMulti[0]); int i; V_VT(&testfile) = VT_BSTR; V_BSTR(&testfile) = SysAllocString(filename); for(i=0; i < tomNumSingle; i++) { touch_file(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomConstantsSingle[i], CP_ACP); todo_wine ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_ACP hres:0x%x\n", tomConstantsSingle[i], hres); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); touch_file(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomConstantsSingle[i], CP_UTF8); todo_wine ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_UTF8 hres:0x%x\n", tomConstantsSingle[i], hres); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); } for(i=0; i < tomNumMulti; i++) { touch_file(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomConstantsMulti[i], CP_ACP); todo_wine ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_ACP hres:0x%x\n", tomConstantsMulti[i], hres); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); touch_file(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomConstantsMulti[i], CP_UTF8); todo_wine ok(hres == S_OK, "ITextDocument_Open: Filename:test.txt Flags:0x%x Codepage:CP_UTF8 hres:0x%x\n", tomConstantsMulti[i], hres); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); } create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomCreateAlways, CP_ACP); todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_ACP\n"); todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomCreateAlways, CP_UTF8); todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_UTF8\n"); todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomOpenAlways, CP_ACP); todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_ACP\n"); todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomOpenAlways, CP_UTF8); todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_UTF8\n"); todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomCreateNew, CP_ACP); todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_ACP\n"); todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomCreateNew, CP_UTF8); todo_wine ok(hres == S_OK, "ITextDocument_Open should success Codepage:CP_UTF8\n"); todo_wine ok(is_existing_file(filename), "ITextDocument_Open should create a file\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); touch_file(filename); hres = ITextDocument_Open(txtDoc, &testfile, tomCreateNew, CP_ACP); todo_wine ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "ITextDocument_Open should fail Codepage:CP_ACP\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); touch_file(filename); hres = ITextDocument_Open(txtDoc, &testfile, tomCreateNew, CP_UTF8); todo_wine ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "ITextDocument_Open should fail Codepage:CP_UTF8\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomOpenExisting, CP_ACP); todo_wine ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "ITextDocument_Open should fail Codepage:CP_ACP\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); create_interfaces(&w, &reOle, &txtDoc, &txtSel); hres = ITextDocument_Open(txtDoc, &testfile, tomOpenExisting, CP_UTF8); todo_wine ok(hres == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "ITextDocument_Open should fail Codepage:CP_UTF8\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); create_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); ITextDocument_Open(txtDoc, &testfile, tomText, CP_ACP); todo_wine ok(is_existing_file(filename) == TRUE, "a file should be created default\n"); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); /* test of share mode */ touch_file(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); ITextDocument_Open(txtDoc, &testfile, tomShareDenyRead, CP_ACP); SetLastError(0xdeadbeef); hFile = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); todo_wine ok(GetLastError() == ERROR_SHARING_VIOLATION, "ITextDocument_Open should fail\n"); CloseHandle(hFile); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); touch_file(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); ITextDocument_Open(txtDoc, &testfile, tomShareDenyWrite, CP_ACP); SetLastError(0xdeadbeef); hFile = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); todo_wine ok(GetLastError() == ERROR_SHARING_VIOLATION, "ITextDocument_Open should fail\n"); CloseHandle(hFile); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); touch_file(filename); create_interfaces(&w, &reOle, &txtDoc, &txtSel); SetLastError(0xdeadbeef); ITextDocument_Open(txtDoc, &testfile, tomShareDenyWrite|tomShareDenyRead, CP_ACP); hFile = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); todo_wine ok(GetLastError() == ERROR_SHARING_VIOLATION, "ITextDocument_Open should fail\n"); CloseHandle(hFile); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); /* tests to check the content */ hFile = CreateFileW(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, chACP, sizeof(chACP)-sizeof(CHAR), &dw, NULL); CloseHandle(hFile); create_interfaces(&w, &reOle, &txtDoc, &txtSel); ITextDocument_Open(txtDoc, &testfile, tomReadOnly, CP_ACP); result = SendMessageA(w, WM_GETTEXT, 1024, (LPARAM)bufACP); todo_wine ok(result == 12, "ITextDocument_Open: Test ASCII returned %d, expected 12\n", result); result = strcmp(bufACP, chACP); todo_wine ok(result == 0, "ITextDocument_Open: Test ASCII set wrong text: Result: %s\n", bufACP); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); hFile = CreateFileW(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, chUTF8, sizeof(chUTF8)-sizeof(CHAR), &dw, NULL); CloseHandle(hFile); create_interfaces(&w, &reOle, &txtDoc, &txtSel); ITextDocument_Open(txtDoc, &testfile, tomReadOnly, CP_UTF8); result = SendMessageA(w, WM_GETTEXT, 1024, (LPARAM)bufACP); todo_wine ok(result == 15, "ITextDocument_Open: Test UTF-8 returned %d, expected 15\n", result); result = strcmp(bufACP, &chUTF8[3]); todo_wine ok(result == 0, "ITextDocument_Open: Test UTF-8 set wrong text: Result: %s\n", bufACP); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); hFile = CreateFileW(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, chUTF16, sizeof(chUTF16)-sizeof(WCHAR), &dw, NULL); CloseHandle(hFile); create_interfaces(&w, &reOle, &txtDoc, &txtSel); ITextDocument_Open(txtDoc, &testfile, tomReadOnly, 1200); result = SendMessageW(w, WM_GETTEXT, 1024, (LPARAM)bufUnicode); todo_wine ok(result == 12, "ITextDocument_Open: Test UTF-16 returned %d, expected 12\n", result); result = lstrcmpW(bufUnicode, &chUTF16[1]); todo_wine ok(result == 0, "ITextDocument_Open: Test UTF-16 set wrong text: Result: %s\n", wine_dbgstr_w(bufUnicode)); release_interfaces(&w, &reOle, &txtDoc, &txtSel); DeleteFileW(filename); VariantClear(&testfile); }