V popisku ovládacího prvku v souboru source mám 45° a místo toho se mi zobrazuje něco jako 45Á° jak to vyřešit aby se to správně zobrazilo?
Fórum › C / C++
Jak zobrazit °
Mohl bys kódu níže ukázat jakým způsobem přidat text do checkboxu? Přidat ne přepsat.
//Global Variables
bool checked;
HWND CheckBox1;
//WindProc
case WM_CREATE:
CheckBox1 = CreateWindow("BUTTON", "",
WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
20, 20, 12, 12,
hwnd, (HMENU)1, NULL, NULL);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case 1:
checked = IsDlgButtonChecked(hwnd, 1);
if (checked) {
CheckDlgButton(hwnd, 1, BST_UNCHECKED);
} else {
CheckDlgButton(hwnd, 1, BST_CHECKED);
break;
break;
ANSI znamená UTF-16? Můj program pracuje s wide characters. Ale neodpověděl si mi na otázku jak do titulku, který byl načtený a zpracovaný z resources mám ručně přidat string. K čemu je mi že mi říkáš ať to zkonvertuju, já nevím jak to tam přidat. Je na to nějaká funkce?
Ve zdrojovém kódu si můžeš nadefinovat pole třeba nějak takhle:
wchar_t pt[] = {/*tady budou čísla unicode znaků*/, L'\0'};
A pak pomocí SetWindowTextW popř. SetDlgItemTextW nastavit pt příslušnému oknu.
Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz
#18 Matěj Andrle
To byl jen příklad který jsem poslal abys mi na něm ukázal jak přidat string do tlačítka. Já to tlačítko ale ve skutečnosti načítám ze souboru .rc . Proto se tu pořád dokolečka ptám na jedno a to samý. Mý/ílka možná nastala z překlepu "V popisku ovládacího prvku v souboru source mám 45° "
mělo být: "V popisku ovládacího prvku v souboru resources.rc mám 45°"
Prostě se ten prvek vytváří automaticky. Je už na stránce. Mám funkci, která vytváří Property Sheet Pages a s tím se vytvoří i ten můj prvek. Já tedy nevím jak do něj přidat ten text.
Mám to teda udělat tak, že pošlu dotaz na ovládací prvek, aby mi vrátil text (45), a k tomu přidám pomocí
SetDlgItemTextW ten stupeň? Že se to neobejde bez toho dotazu a nejde tam přidat aniž by se číslo 45 přepsalo...
Pokud jde o text v .rc souboru, tak alespoň na českých Windows to funguje, právě jsem to zkusil, jen musíš mít jazkyk toho dialogu nastavený na češtinu. Do "caption" buttonu jsem napsal 45° a je to tam jak v resource editoru, tak po spuštění..
Možná máš problém že jsi nechal při založení projektu vygenerovat ten .rc soubor a ten je nastavený na angličtinu. Zkus začít prázdným proektem a když přidáš resource, bude už český. Vyzkoušeno ve VS 2013, ale ve VS2008 jsem to dělal stejně a na problémy se znaky jako "copyright" a pod jsem nenarazil.
Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz
#23 oxidián
To není věc zdrojového kódu. Prostě jsem zkusil v jednom existujícíim projektu do textu tlačítka přidat to "kolečko" a spustit. Jenom jak jsem psal musí ten resource mít nastavený jazyk češtinu, nejlépe tak že nepoužješ ten vygenerovaný při založení projektu, ale do projektu kde není .rc soubor přidáš nějaký resource (třeba právě ten dialog) a VS založí soubor .rc a resource.h už s češtinou.
PS: Domnívám se že ten .rc soubor klidně může být v ANSI (samozřejmě se správně nastaveným jazykem/kódováním). Windows totiž běží v unicode a všechny texty oken jsou interně uložený v unicode i když např použiješ SetWindowsTextA, tak text se automaticky převede do unicode a poté uloží do bufferu pro text okna jako unicode. Tj. jakmile se text správně načte z resource, převede se do unicode (předpokládám že voláním API fce MultiByteToWideChar s příslušným parametrem pro znakovou sadu) a tak by pak aplikace měla bez problémů běžet na libovolné jazykové verzi Windows.
Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz
#25 oxidián
To byla reakce na původní dotaz, kde jsi psal že se to v runtime nezobrazuje to co máš v resource editoru. Tak jsem napsal že mě to funguje a co pro to udělat.
Předpokládám bude platit obecně (tj nejen pro češtinu), že jazyk resources musí odpovídat kódování toho .rc souboru, které nejspíš bude odvizené od aktuálního jazykového nastavení Windows.
Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz
Tak jsem po delší době zpátky.
V tom souboru mám:
CAPTION "Map/Terrain°"
A v dialogovém okně se mi zobrazuje: (A°)° ... místo (A°) je znak A kde ° je nad písmenem A. Jsou to dva znaky, takže kolečko se zobrazí, ale je tam navíc před tím cizí znak.
Nechápu jak mám nastavit jazyk souboru. Není problém nastavit UTF-8 v externím editoru, ale jak nastavit jazyk? Zakládat nový soubor se mi dvakrát nechce.
Edit: No dobre, tak jsem to udělal, odstranil jsem ten soubor z projektu a znovu ho přidal ... podotýkám že v souboru je text:
CAPTION "Map/Terrain°Čeština"
a po zkompilování se žádný zázrak nestal, Češtinu tam stále nevidím
Ještě jsem zkoušel rady co jsou zde:
http://stackoverflow.com/questions/1319461/how-do-i-turn-off-unicode-in-a-vc-project
a nic z toho mi to nepomohlo
Ještě jsem navíc zkusil změnit toto
pg.pszTemplate = MAKEINTRESOURCE(IDD_MSGS + i);
(pg je stránka property sheet)
na
pg.pszTemplate = MAKEINTRESOURCEA(IDD_MSGS + i);
a do common.rc hned na začátek jsem vrazil:
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
místo angličtiny
a čeština se stále nezobrazuje.
Tak fakt už nevím co s tím
Mohl byste se na to někdo podívat?
45Á° - a s carkou pouziva kodovani unicode. Kdyz to zobrazis jako unicode, zobrazi se to ok. Kdyz to zobrazis nebo prekodujes v jinem kodovani, tak je vysledek nejisty.
Kdyz je soubor txt, tak se tam jazyk nijak neuklada. Ale treba, kdyz das u excelu export do csv, tak si ulozi jako prvni znak souboru unicode BOOM znak. Coz je pak dost neprijemne. Vetsinou u txt souboru totiz vis, v jakem jsou kodovani a taky je to starsi format, kde se kodovani proste neresilo.
Mno, ale k veci. C neznam.
V php to resim tak, ze soubor nactu a zobrazim. Pokud to zobrazuje spatne v html, tak pridam jeste php funkce header() a zmenim kodovani, ktere mi vnucuje server na utf. Cili, takhle je to v normalnim priklade, kde kodovani neresi, pocitaji s tim, ze default server php kodovani je stejne jako v souboru
<?php
file_get_contents('slozka/soubor.txt'); // soubor v utf
echo $str;
?>
Tady se kodovani resi
<?php
header("Content-Type: text/html; charset=utf-8");
file_get_contents('slozka/soubor.txt'); // soubor v utf
echo $str;
?>
A pokud mas ale stranku ve win1250 a soubor v utf, tak je treba to prekodovat. V php je na to mb_conv nebo iconv
<?php
header("Content-Type: text/html; charset=win-1250");
$str = file_get_contents('slozka/soubor.txt'); // soubor v utf
$str = iconv('UTF-8', 'windows-1250', $str);
echo $str;
?>
http://cz.php.net/manual/en/ref.mbstring.php - pro utf jsou v php spesl funkce. klasicke nepocitaji s tim, ze znak muze byt kodovani jako dva znaky, takze selhavaji.
Mozna je to tvuj pripad, soubor nactes, pak pouzijes nejakou funkci jako substring a ona se udela spatne, protoze cecko ma pro praci s utf jinou funkci pro substring.
A treti pripad je, kdyz mas databazi, mysql 5+ a tam mas chybne kodovani. To nebudu rozepisovat.
Mno, a jeste mne napada, ten soubor, neotviras to treba nejakym editacnim programem? V tom programu mas treba nastavene spatne kodovani. Casto se to treba resi u PSPad, ze on pridava do souboru BOM znak a na serveru pak takovy program dela problemy. Je treba v programu nebo pri zakladani noveho projektu rici v jakem kodovani budes pracovat a zda tam chces ci nechces prodat BOM znak (mozna v nastaveni). Pokud soubor otevres ted, kdyz ma ten program nastavene treba win1250, tak jej otevre jako win1250. nebo mozna jej otvira jako win120 i v UTF nastaveni, protoze ocekava BOM znak. (viz treba excel, ten export do csv a import v kodovani utf, zkus si tam odstranit ten znak a on to pak neumi s diakritikou spravne precist).
Cili, pokud najdes to nastaveni, zmenis ho, zkus uplne vse pozavirat, udelat novy projekt a testni si, zda to ulozi spravne v utf nebo ne, zda se tam zobrazi do A s carkou v editoru, ktery utf neumi (notepad, mozna, ale mozna reaguje na BOM znak a pak by to zobrazil uz ve spravnem kodovani bez A s carkou)
Náhodou jsem zjistil, že Common Dialog Boxes
https://msdn.microsoft.com/en-us/library/cc194807.aspx
https://www-user.tu-chemnitz.de/~ygu/petzold/ch11c.htm
nepodporuje languages kromě případů že se to řeší nějak přes templates. Na prvním odkazu píšou, že je tam podporována jen angličtina. Můžete mi říct zda můj kód podporuje language (jiný jazyk než ang.)?
#include "makewindows.h"
#include "../callback/editorsDlgProc.h"
DLGPROC procs[NUM_PAGES] =
{
&IMsgsDlgProc,
&PlyDlgProc,
&VictDlgProc,
&DisDlgProc,
&Map1DlgProc,
&Units1DlgProc,
&Triggers1DlgProc,
&Map2DlgProc,
&Units2DlgProc,
&Triggers2DlgProc
}; // 3 modules no. 2 must be on the end - after Map,Units,Triggers modules 1
// PAGES_TEMPLATES_BACKUP pagesBackup;
HWND MakeMapView(HWND sheet, int cmdshow)
{
HWND ret;
RECT rect;
GetWindowRect(sheet, &rect);
ret = CreateMapView(sheet, rect.right + MAP_OFFSET, rect.top, &scen);
ShowWindow(ret, cmdshow);
return ret;
}
/*
MakeSheet: Creates the main property sheet window.
Parameters:
HINSTANCE app: Handle to the application loading the sheet.
Note: Called once and only once by WinMain().
*/
HPROPSHEETPAGE pages[NUM_PAGES];
HWND MakeSheet(HINSTANCE app)
{
PROPSHEETHEADER header;
PROPSHEETPAGE pg; //used to create each page
HWND sheet;
//create pages
pg.dwSize = sizeof(PROPSHEETPAGE);
pg.dwFlags = PSP_DEFAULT;
pg.hInstance = app;
for (int i = 0; i < NUM_PAGES; i++)
{
pg.pszTemplate = MAKEINTRESOURCEA(IDD_MSGS + i); //template IDs are in display order
pg.pfnDlgProc = procs[i];
pg.lParam = 0;
pages[i] = CreatePropertySheetPage(&pg);
} // for
// Save handlers of the pages for convenience:
propdata.pages.info = pages[0];
propdata.pages.players = pages[1];
propdata.pages.victory = pages[2];
propdata.pages.disables = pages[3];
propdata.pages.map1 = pages[4];
propdata.pages.units1 = pages[5];
propdata.pages.triggers1 = pages[6];
propdata.pages.map2 = pages[7];
propdata.pages.units2 = pages[8];
propdata.pages.triggers2 = pages[9];
//create sheet
header.dwSize = sizeof(header);
header.dwFlags = PSH_MODELESS | PSH_USECALLBACK |
PSH_NOAPPLYNOW | PSH_NOCONTEXTHELP | PSH_USEICONID;
header.hwndParent = NULL;
header.hInstance = app;
header.pszIcon = MAKEINTRESOURCE(IDI_LOGO);
header.pszCaption = szTitle;
header.nPages = NUM_PAGES;
header.nStartPage = 0;
header.phpage = pages;
// The function defined in propsheetproc.cpp
// initializes the property sheet
header.pfnCallback = &PropSheetProc;
sheet = (HWND)PropertySheet(&header);
PropSheet_RemovePage( sheet, 4, pages[4] );
PropSheet_RemovePage( sheet, 5, pages[5] );
PropSheet_RemovePage( sheet, 6, pages[6] );
//add status bar here (can't be done in propsheet_init.cpp PropSheetProc )
propdata.statusbar = CreateWindow(STATUSCLASSNAME, welcome,
WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
sheet, (HMENU)IDS_MAIN, hApp, NULL);
return sheet;
}
// HINSTANCE app: Handle to the application using the sheet
void SwitchPages(HINSTANCE app, HWND hPropSheetDlg, Scenario * scenario )
{
HWND hCurrentPage = PropSheet_GetCurrentPageHwnd(hPropSheetDlg);
int currentPageIndex = PropSheet_HwndToIndex( hPropSheetDlg, hCurrentPage);
if ( scenario->isOpen() )
{ // Remove map1, units1, triggers1
PropSheet_RemovePage( hPropSheetDlg, 4, pages[4] );
PropSheet_RemovePage( hPropSheetDlg, 5, pages[5] );
PropSheet_RemovePage( hPropSheetDlg, 6, pages[6] );
//PropSheet_RemovePage( hPropSheetDlg, 7, pages[7] );
// Nutné je odebrat 8, jinak se při otevření scénáře objeví Units2
PropSheet_RemovePage( hPropSheetDlg, 8, pages[8] );
}
else
{ // Remove map1, units1, triggers1
PropSheet_RemovePage( hPropSheetDlg, 4, pages[4] );
PropSheet_RemovePage( hPropSheetDlg, 5, pages[5] );
PropSheet_RemovePage( hPropSheetDlg, 6, pages[6] );
// In the case that it is already closed:
PropSheet_RemovePage( hPropSheetDlg, 7, pages[7] );
PropSheet_RemovePage( hPropSheetDlg, 8, pages[8] );
PropSheet_RemovePage( hPropSheetDlg, 9, pages[9] );
}
PROPSHEETPAGE pg; //used to create each page
//create pages
pg.dwSize = sizeof(PROPSHEETPAGE);
pg.dwFlags = PSP_DEFAULT;
pg.hInstance = app;
const int PAGES_NO_CHANGE = 4;
for (int i = 0; i < 6; i++)
{
int a = PAGES_NO_CHANGE+i;
pg.pszTemplate = MAKEINTRESOURCEA(IDD_MSGS + (PAGES_NO_CHANGE+i) ); //template IDs are in display order
pg.pfnDlgProc = procs[PAGES_NO_CHANGE+i];
pg.lParam = 0;
pages[PAGES_NO_CHANGE+i] = CreatePropertySheetPage(&pg);
} // for
// Save handlers of the pages for convenience:
propdata.pages.map1 = pages[4];
propdata.pages.units1 = pages[5];
propdata.pages.triggers1 = pages[6];
propdata.pages.map2 = pages[7];
propdata.pages.units2 = pages[8];
propdata.pages.triggers2 = pages[9];
if ( scenario->isOpen() )
{
PropSheet_InsertPage( hPropSheetDlg, 4, pages[4]);
PropSheet_InsertPage( hPropSheetDlg, 5, pages[5]);
PropSheet_InsertPage( hPropSheetDlg, 6, pages[6]);
}
else
{
PropSheet_InsertPage( hPropSheetDlg, 7, pages[7]);
PropSheet_InsertPage( hPropSheetDlg, 8, pages[8]);
PropSheet_InsertPage( hPropSheetDlg, 9, pages[9]);
}
PropSheet_SetCurSel( hPropSheetDlg, hCurrentPage, currentPageIndex);
}
Tak češtinu se mi nepovedlo zobrazit pravděpodobně proto, že Property sheet využívá knihovnu Common Dialog boxes, která podporuje jen angličtinu. Šaškovat s šablonami nechci, takže jednoduché řešení nakonec:
/* Options: Map Viewer */
IDD_MAPVIEWER DIALOG DISCARDABLE 75, 0, 186, 140
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Map Viewer options"
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "",IDC_STATIC,5,5,160,32,SS_LEFT
GROUPBOX "Rotation",IDC_STATIC,3,5,180,28
AUTOCHECKBOX "45",IDC_O_MPROTATION,9,18,20,8,BS_AUTOCHECKBOX | WS_TABSTOP
LTEXT "°",IDC_STATIC,29,18,5,2,SS_LEFT
DEFPUSHBUTTON "OK",IDOK,70,118,50,14
END
Normálně jsem oříznul to první písmeno tak aby zůstalo jen kolečko.
Dík za radu.
Zkusil bych jako font nastavit "MS Shell Dlg" - jak to nastaví VS při vytvoření dialogu v resource editoru.
A nemyslím že by shell podporoval pro dialogy jen angličtinu, ten odkaz výše uvedený je snad ještě z doby windows 95 a projekt pro ANSI..
Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz
#36 oxidián
Myslím že máš (i ve Windows XP) - ten název fontu není font v pravém slova smyslu, ale říká tím kompilátoru resource že má použít font, který systém (shell) používá pro dialogová okna.
Prostě to v .rc souboru u toho skriptu dialoguručně přepiš a zkus zda se něco změní. Jestli se nepletu tak např. tenhle font zajistí aby se znaky v hesle (ne)zobrazovaly jako kolečka/hvězdičky - jinak to jsou mohou třeba jen malé tečky nebo svislé čáry.
Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz
No ale to by znamenalo, že by se mohl měnit vzhled dialogového okna, což není ideální. Protože pokud někdo používá jiný font než já (myslím že je to Arial) tak by se mu nezobrazily správně ty ovládací prvky a text v dialogovém okně. Nejlepší by bylo vrazit tam fixně Arial, protože ten si myslím je na všech Windowsech.
A nemůže to být tím že nějaký cpp soubor je v unicode? Zrovna jsem na jeden narazll když se mi zobrazila hláška při ukládání že soubor obsahuje znak který není v unicode...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Jak skrýt a následně zobrazit tlačítko? — založil w3q
GUI v C# - jak zobrazit vlastní cursor? — založil ospaly.stanislav
Jak zobrazit graficky strukturu a vazby databáze? — založil Honza
Jak pomocí PHP zobrazit obsah databáze na webu? — založil Luda123
Jak zobrazit jinou stránku bez nutnosti scrollování? — založil Mir57
Moderátoři diskuze