c + + - Udskiftning af tekster 'OK', 'Annuller', 'Ja', 'Nej' i Windows Opgave dialogbøger

Indlæg af Hanne Mølgaard Plasc

Problem



På en Win32 Opgave Dialog vises teksterne 'OK', 'Annuller', 'Ja', 'Nej' osv. På standardknapperne automatisk på systemets sprog. Det kan være et problem, hvis sproget i en software er anderledes af systemets sprog. [14]


F.eks. Hvis en kunde installerer den franske version af vores software på en engelsk Windows, vil Opgave Dialogens indhold være på fransk, men standardknapperne nederst på Opgave Dialogen vil være på engelsk, uanset hvad.


Ved nogen, hvordan kan jeg ændre disse tekster.


Dette spørgsmål ligner dette SO spørgsmål, der omhandler ejendomsark.


UPDATE:


Jeg forsøgte at udlede en klasse fra CTaskDialog og tilsidesætte OnInit() metoden i oder for at få fat i CTaskDialog s m\_hWnd og have en lignende tilgang end i det ovennævnte spørgsmål, men desværre CTaskDialog::m\_hWnd er privat:


class CMyTaskDialog : public CTaskDialog
{
public:
  CMyTaskDialog(\_In\_ const CString& strContent, \_In\_ const CString& strMainInstruction, \_In\_ const CString& strTitle,
    \_In\_ int nCommonButtons = TDCBF\_OK\_BUTTON | TDCBF\_CANCEL\_BUTTON, \_In\_ int nTaskDialogOptions = TDF\_ENABLE\_HYPERLINKS | TDF\_USE\_COMMAND\_LINKS,
    \_In\_ const CString& strFooter = CString());

  virtual HRESULT OnCreate();
};

CMyTaskDialog::CMyTaskDialog(\_In\_ const CString& strContent, \_In\_ const CString& strMainInstruction, \_In\_ const CString& strTitle,
  \_In\_ int nCommonButtons, \_In\_ int nTaskDialogOptions,
  \_In\_ const CString& strFooter) :
  CTaskDialog(strContent, strMainInstruction, strTitle,nCommonButtons, nTaskDialogOptions, strFooter)
{
}


HRESULT CMyTaskDialog::OnCreate()
{
  // tried to do stuff with m\_hWnd, but m\_hWnd is private :-(
  return \_\_super::OnCreate();
}


Men dette er en meget dårlig ide, det kan gøres ordentligt som vist i mit eget svar nedenfor.

Bedste reference


Det er faktisk ret simpelt:


I stedet for at bruge standardknapperne TDCBF\_YES\_BUTTON, TDCBF\_NO\_BUTTON, TDCBF\_CANCEL\_BUTTON osv. Skal du bruge ikke disse knapper, men tilføj dine egne knapper med AddCommandControl og opret CTaskDialog objekt med 0 i parameteren nTaskDialogOptions og dermed deaktivere TDF\_USE\_COMMAND\_LINKS -tilstanden. Derefter vil disse knapper ikke blive vist som kommandolinks, men som enkle knapper.


Minimalt eksempel:


  CTaskDialog taskDialog(L"", L"Voulez-vous enregistrer les modifications?",
                         L"Some title", 0, 0);

  taskDialog.AddCommandControl(100, L"Oui");
  taskDialog.AddCommandControl(102, L"Non"); 
  taskDialog.SetDefaultCommandControl(100);
  INT\_PTR x = taskDialog.DoModal();
  ...


Indtast billedbeskrivelse her [16]


Der er dog et problem: Du kan ikke have knapper og en kommandolink i samme opgavedialog. Men dette problem er en mindre (i hvert fald for mig), fordi IMO, der har kommandolinjer og knapper i samme opgaver dialog, er sandsynligvis ikke den bedste idé alligevel.