bool wxMenuBar::Append(wxMenu *menu, const wxString& title) { WXHMENU submenu = menu ? menu->GetHMenu() : 0; wxCHECK_MSG( submenu, false, wxT("can't append invalid menu to menubar") ); if ( !wxMenuBarBase::Append(menu, title) ) return false; menu->wxMenuBase::SetTitle(title); #if defined(WINCE_WITHOUT_COMMANDBAR) if (IsAttached()) #else if (GetHmenu()) #endif { #if defined(WINCE_WITHOUT_COMMANDBAR) if (!GetToolBar()) return false; TBBUTTON tbButton; memset(&tbButton, 0, sizeof(TBBUTTON)); tbButton.iBitmap = I_IMAGENONE; tbButton.fsState = TBSTATE_ENABLED; tbButton.fsStyle = TBSTYLE_DROPDOWN | TBSTYLE_NO_DROPDOWN_ARROW | TBSTYLE_AUTOSIZE; size_t pos = GetMenuCount(); HMENU hPopupMenu = (HMENU) menu->GetHMenu() ; tbButton.dwData = (DWORD)hPopupMenu; wxString label = wxStripMenuCodes(title); tbButton.iString = (int) wxMSW_CONV_LPCTSTR(label); tbButton.idCommand = NewControlId(); if (!::SendMessage((HWND) GetToolBar()->GetHWND(), TB_INSERTBUTTON, pos, (LPARAM)&tbButton)) { wxLogLastError(wxT("TB_INSERTBUTTON")); return false; } #else if ( !::AppendMenu(GetHmenu(), MF_POPUP | MF_STRING, (UINT_PTR)submenu, title.t_str()) ) { wxLogLastError(wxT("AppendMenu")); } #endif #if wxUSE_ACCEL if ( menu->HasAccels() ) { // need to rebuild accelerator table RebuildAccelTable(); } #endif // wxUSE_ACCEL if (IsAttached()) Refresh(); } return true; }
bool wxWinHelpController::KeywordSearch(const wxString& k, wxHelpSearchMode WXUNUSED(mode)) { if (m_helpFile.empty()) return false; wxString str = GetValidFilename(m_helpFile); return WinHelp(GetSuitableHWND(this), str.t_str(), HELP_PARTIALKEY, (ULONG_PTR)wxMSW_CONV_LPCTSTR(k)) != 0; }
// Use topic or HTML filename bool wxCHMHelpController::DisplaySection(const wxString& section) { if (m_helpFile.IsEmpty()) return false; // Is this an HTML file or a keyword? if ( section.Find(wxT(".htm")) != wxNOT_FOUND ) { // interpret as a file name return CallHtmlHelp(HH_DISPLAY_TOPIC, wxMSW_CONV_LPCTSTR(section)); } return KeywordSearch(section); }
bool wxRegKey::SetValue(const wxString& szValue, const wxString& strValue) { if ( CONST_CAST Open() ) { m_dwLastError = RegSetValueEx((HKEY) m_hKey, RegValueStr(szValue), (DWORD) RESERVED, REG_SZ, (RegString)wxMSW_CONV_LPCTSTR(strValue), (strValue.Len() + 1)*sizeof(wxChar)); if ( m_dwLastError == ERROR_SUCCESS ) return true; } wxLogSysError(m_dwLastError, _("Can't set value of '%s'"), GetFullName(this, szValue)); return false; }
// New constructor that takes origin and extent. If you use this, don't // give origin/extent arguments to wxMakeMetafilePlaceable. wxMetafileDCImpl::wxMetafileDCImpl(wxDC *owner, const wxString& file, int xext, int yext, int xorg, int yorg) : wxMSWDCImpl(owner) { m_minX = 10000; m_minY = 10000; m_maxX = -10000; m_maxY = -10000; if ( !file.empty() && wxFileExists(file) ) wxRemoveFile(file); m_hDC = (WXHDC) CreateMetaFile(file.empty() ? NULL : wxMSW_CONV_LPCTSTR(file)); m_ok = true; ::SetWindowOrgEx((HDC) m_hDC,xorg,yorg, NULL); ::SetWindowExtEx((HDC) m_hDC,xext,yext, NULL); // Actual Windows mapping mode, for future reference. m_windowsMappingMode = MM_ANISOTROPIC; SetMapMode(wxMM_TEXT); // NOTE: does not set HDC mapmode (this is correct) }
void wxFontEnumeratorHelper::DoEnumerate() { #ifndef __WXMICROWIN__ HDC hDC = ::GetDC(NULL); #ifdef __WXWINCE__ ::EnumFontFamilies(hDC, m_facename.empty() ? NULL : wxMSW_CONV_LPCTSTR(m_facename), (wxFONTENUMPROC)wxFontEnumeratorProc, (LPARAM)this) ; #else // __WIN32__ LOGFONT lf; lf.lfCharSet = (BYTE)m_charset; wxStrlcpy(lf.lfFaceName, m_facename.c_str(), WXSIZEOF(lf.lfFaceName)); lf.lfPitchAndFamily = 0; ::EnumFontFamiliesEx(hDC, &lf, (wxFONTENUMPROC)wxFontEnumeratorProc, (LPARAM)this, 0 /* reserved */) ; #endif // Win32/CE ::ReleaseDC(NULL, hDC); #endif }
bool wxToolMenuBar::Realize() { const size_t nTools = GetToolsCount(); if ( nTools == 0 ) { // nothing to do return true; } #if 0 // delete all old buttons, if any for ( size_t pos = 0; pos < m_nButtons; pos++ ) { if ( !::SendMessage(GetHwnd(), TB_DELETEBUTTON, 0, 0) ) { wxLogDebug(wxT("TB_DELETEBUTTON failed")); } } #endif // 0 bool lastWasRadio = false; wxToolBarToolsList::compatibility_iterator node; for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) { wxToolMenuBarTool *tool = (wxToolMenuBarTool*) node->GetData(); TBBUTTON buttons[1] ; TBBUTTON& button = buttons[0]; wxZeroMemory(button); bool isRadio = false; switch ( tool->GetStyle() ) { case wxTOOL_STYLE_CONTROL: button.idCommand = tool->GetId(); // fall through: create just a separator too // TODO: controls are not yet supported on wxToolMenuBar. case wxTOOL_STYLE_SEPARATOR: button.fsState = TBSTATE_ENABLED; button.fsStyle = TBSTYLE_SEP; break; case wxTOOL_STYLE_BUTTON: if ( HasFlag(wxTB_TEXT) ) { const wxString& label = tool->GetLabel(); if ( !label.empty() ) { button.iString = (int) wxMSW_CONV_LPCTSTR(label); } } const wxBitmap& bmp = tool->GetNormalBitmap(); wxBitmap bmpToUse = bmp; if (bmp.GetWidth() < 16 || bmp.GetHeight() < 16 || bmp.GetMask() != NULL) { wxMemoryDC memDC; wxBitmap b(16,16); memDC.SelectObject(b); wxColour col = wxColour(192,192,192); memDC.SetBackground(wxBrush(col)); memDC.Clear(); int x = (16 - bmp.GetWidth())/2; int y = (16 - bmp.GetHeight())/2; memDC.DrawBitmap(bmp, x, y, true); memDC.SelectObject(wxNullBitmap); bmpToUse = b; tool->SetNormalBitmap(b); } int n = 0; if ( bmpToUse.IsOk() ) { n = ::CommandBar_AddBitmap( (HWND) GetHWND(), NULL, (int) (HBITMAP) bmpToUse.GetHBITMAP(), 1, 16, 16 ); } button.idCommand = tool->GetId(); button.iBitmap = n; if ( tool->IsEnabled() ) button.fsState |= TBSTATE_ENABLED; if ( tool->IsToggled() ) button.fsState |= TBSTATE_CHECKED; switch ( tool->GetKind() ) { case wxITEM_RADIO: button.fsStyle = TBSTYLE_CHECKGROUP; if ( !lastWasRadio ) { // the first item in the radio group is checked by // default to be consistent with wxGTK and the menu // radio items button.fsState |= TBSTATE_CHECKED; tool->Toggle(true); } isRadio = true; break; case wxITEM_CHECK: button.fsStyle = TBSTYLE_CHECK; break; default: wxFAIL_MSG( wxT("unexpected toolbar button kind") ); // fall through case wxITEM_NORMAL: button.fsStyle = TBSTYLE_BUTTON; } break; } if ( !::CommandBar_AddButtons( (HWND) GetHWND(), 1, buttons ) ) { wxFAIL_MSG( wxT("Could not add toolbar button.")); } lastWasRadio = isRadio; } return true; }
bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) { // Find out which MSW item before which we'll be inserting before // wxMenuBarBase::Insert is called and GetMenu(pos) is the new menu. // If IsAttached() is false this won't be used anyway bool isAttached = #if defined(WINCE_WITHOUT_COMMANDBAR) IsAttached(); #else (GetHmenu() != 0); #endif int mswpos = (!isAttached || (pos == m_menus.GetCount())) ? -1 // append the menu : MSWPositionForWxMenu(GetMenu(pos),pos); if ( !wxMenuBarBase::Insert(pos, menu, title) ) return false; menu->wxMenuBase::SetTitle(title); if ( isAttached ) { #if defined(WINCE_WITHOUT_COMMANDBAR) if (!GetToolBar()) return false; TBBUTTON tbButton; memset(&tbButton, 0, sizeof(TBBUTTON)); tbButton.iBitmap = I_IMAGENONE; tbButton.fsState = TBSTATE_ENABLED; tbButton.fsStyle = TBSTYLE_DROPDOWN | TBSTYLE_NO_DROPDOWN_ARROW | TBSTYLE_AUTOSIZE; HMENU hPopupMenu = (HMENU) menu->GetHMenu() ; tbButton.dwData = (DWORD)hPopupMenu; wxString label = wxStripMenuCodes(title); tbButton.iString = (int) wxMSW_CONV_LPCTSTR(label); tbButton.idCommand = NewControlId(); if (!::SendMessage((HWND) GetToolBar()->GetHWND(), TB_INSERTBUTTON, pos, (LPARAM)&tbButton)) { wxLogLastError(wxT("TB_INSERTBUTTON")); return false; } wxUnusedVar(mswpos); #else if ( !::InsertMenu(GetHmenu(), mswpos, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR)GetHmenuOf(menu), title.t_str()) ) { wxLogLastError(wxT("InsertMenu")); } #endif #if wxUSE_ACCEL if ( menu->HasAccels() ) { // need to rebuild accell table RebuildAccelTable(); } #endif // wxUSE_ACCEL if (IsAttached()) Refresh(); } return true; }
WXHMENU wxMenuBar::Create() { // Note: this doesn't work at all on Smartphone, // since you have to use resources. // We'll have to find another way to add a menu // by changing/adding menu items to an existing menu. #if defined(WINCE_WITHOUT_COMMANDBAR) if ( m_hMenu != 0 ) return m_hMenu; wxToolMenuBar * const bar = static_cast<wxToolMenuBar *>(GetToolBar()); if ( !bar ) return NULL; HWND hCommandBar = GetHwndOf(bar); // notify comctl32.dll about the version of the headers we use before using // any other TB_XXX messages SendMessage(hCommandBar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); TBBUTTON tbButton; wxZeroMemory(tbButton); tbButton.iBitmap = I_IMAGENONE; tbButton.fsState = TBSTATE_ENABLED; tbButton.fsStyle = TBSTYLE_DROPDOWN | TBSTYLE_NO_DROPDOWN_ARROW | TBSTYLE_AUTOSIZE; for ( unsigned i = 0; i < GetMenuCount(); i++ ) { HMENU hPopupMenu = (HMENU) GetMenu(i)->GetHMenu(); tbButton.dwData = (DWORD)hPopupMenu; wxString label = wxStripMenuCodes(GetMenuLabel(i)); tbButton.iString = (int) wxMSW_CONV_LPCTSTR(label); tbButton.idCommand = NewControlId(); if ( !::SendMessage(hCommandBar, TB_INSERTBUTTON, i, (LPARAM)&tbButton) ) { wxLogLastError(wxT("TB_INSERTBUTTON")); } } m_hMenu = bar->GetHMenu(); return m_hMenu; #else // !__WXWINCE__ if ( m_hMenu != 0 ) return m_hMenu; m_hMenu = (WXHMENU)::CreateMenu(); if ( !m_hMenu ) { wxLogLastError(wxT("CreateMenu")); } else { for ( wxMenuList::iterator it = m_menus.begin(); it != m_menus.end(); ++it ) { if ( !::AppendMenu((HMENU)m_hMenu, MF_POPUP | MF_STRING, (UINT_PTR)(*it)->GetHMenu(), (*it)->GetTitle().t_str()) ) { wxLogLastError(wxT("AppendMenu")); } } } return m_hMenu; #endif // __WXWINCE__/!__WXWINCE__ }
bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) { // Find out which MSW item before which we'll be inserting before // wxMenuBarBase::Insert is called and GetMenu(pos) is the new menu. // If IsAttached() is false this won't be used anyway bool isAttached = #if defined(WINCE_WITHOUT_COMMANDBAR) IsAttached(); #else (GetHmenu() != 0); #endif if ( !wxMenuBarBase::Insert(pos, menu, title) ) return false; menu->wxMenuBase::SetTitle(title); if ( isAttached ) { #if defined(WINCE_WITHOUT_COMMANDBAR) if (!GetToolBar()) return false; TBBUTTON tbButton; memset(&tbButton, 0, sizeof(TBBUTTON)); tbButton.iBitmap = I_IMAGENONE; tbButton.fsState = TBSTATE_ENABLED; tbButton.fsStyle = TBSTYLE_DROPDOWN | TBSTYLE_NO_DROPDOWN_ARROW | TBSTYLE_AUTOSIZE; HMENU hPopupMenu = (HMENU) menu->GetHMenu() ; tbButton.dwData = (DWORD)hPopupMenu; wxString label = wxStripMenuCodes(title); tbButton.iString = (int) wxMSW_CONV_LPCTSTR(label); tbButton.idCommand = NewControlId(); if (!::SendMessage((HWND) GetToolBar()->GetHWND(), TB_INSERTBUTTON, pos, (LPARAM)&tbButton)) { wxLogLastError(wxT("TB_INSERTBUTTON")); return false; } #else // We have a problem with the index if there is an extra "Window" menu // in this menu bar, which is added by wxMDIParentFrame to it directly // using Windows API (so that it remains invisible to the user code), // but which does affect the indices of the items we insert after it. // So we check if any of the menus before the insertion position is a // foreign one and adjust the insertion index accordingly. int mswExtra = 0; // Skip all this if the total number of menus matches (notice that the // internal menu count has already been incremented by wxMenuBarBase:: // Insert() call above, hence -1). int mswCount = ::GetMenuItemCount(GetHmenu()); if ( mswCount != -1 && static_cast<unsigned>(mswCount) != GetMenuCount() - 1 ) { wxMenuList::compatibility_iterator node = m_menus.GetFirst(); for ( size_t n = 0; n < pos; n++ ) { if ( ::GetSubMenu(GetHmenu(), n) != GetHmenuOf(node->GetData()) ) mswExtra++; else node = node->GetNext(); } } if ( !::InsertMenu(GetHmenu(), pos + mswExtra, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR)GetHmenuOf(menu), title.t_str()) ) { wxLogLastError(wxT("InsertMenu")); } #endif #if wxUSE_ACCEL if ( menu->HasAccels() ) { // need to rebuild accell table RebuildAccelTable(); } #endif // wxUSE_ACCEL if (IsAttached()) Refresh(); } return true; }
// we must pass NULL if the string is empty to metafile functions static inline const wxChar *GetMetaFileName(const wxString& fn) { return !fn ? NULL : wxMSW_CONV_LPCTSTR(fn); }