ES_PASSWORD v editboxu, SetWindowLong() (WIN32) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ES_PASSWORD v editboxu, SetWindowLong() (WIN32) – C / C++ – Fórum – Programujte.comES_PASSWORD v editboxu, SetWindowLong() (WIN32) – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
ProXicT0
Návštěvník
16. 12. 2013   #1
-
0
-

Zdravím, 

mám vytvořený editbox a checkbox:
 

edit5 = CreateWindow(TEXT("EDIT"), TEXT(""), WS_VISIBLE | WS_CHILD | ES_PASSWORD, RESx2 / 2 - 60, 30 + 35 + 35, 120, 15, hwnd2, (HMENU)ID_EDIT5, NULL, NULL);

checkbox2 = CreateWindow(TEXT("Button"), TEXT("Show Password"), BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE, RESx2 / 2 - 60, 17 + 35 + 35 + 35 + 35, 13, 13, hwnd2, (HMENU)ID_CHECKBOX2, NULL, NULL);
                      SendMessage(checkbox2, WM_SETFONT, (WPARAM)font, TRUE);

Defaultně je checkbox nezaškrtnutý.
Když uživatel zadá heslo do edit5, chtěl bych, aby se zobrazovaly pouze tečky (maska hesla) a když zaškrtne checkbox, tak aby se zobrazil text. To zatím funguje, ale když uživatel znovu checkbox odškrtne, chtěl bych, aby se heslo znovu zamaskovalo tak, jak bylo. 

if(uMsg == WM_COMMAND && LOWORD(wParam) == ID_CHECKBOX2)
					   {
						   HWND hwnd2 = (HWND)lParam;
						   int state = SendMessage(hwnd2, BM_GETCHECK, wParam, lParam);
						   if(state == BST_CHECKED)
						   {
							   SendMessage(edit5, EM_SETPASSWORDCHAR, FALSE, FALSE);
							   SetFocus(edit5);
						   }
						   else
						   {
							   LONG style = GetWindowLong(edit5, GWL_STYLE);
							   SetWindowLong(edit5, GWL_STYLE, style & ES_PASSWORD);
							   ShowWindow(edit5, 1);
						   }
					   }

Zkoušel jsem i SendMessage(edit5, EM_SETPASSWORDCHAR, (WPARAM)'•', FALSE); ale to mi zamaskuje jinak, než původně - nečitelně a vypadá to jinak.
Předem díky za pomoc ;-)

Nahlásit jako SPAM
IP: 77.240.98.–
z
~ Anonymní uživatel
268 příspěvků
17. 12. 2013   #2
-
0
-

Tak zkus zjistit, jaký znak tam normálně je pomocí EM_GETPASSWORDCHAR.

Nahlásit jako SPAM
IP: 88.101.8.–
liborb
~ Redaktor
+18
Guru
17. 12. 2013   #3
-
0
-

Styl ES_PASSWORD nastav rovnou při vytváření (což děláš) a od/zaškrtáváním checkboxu pouze nastavuj maskovací znak, protože když nastavíš 0, tak zrušíš maskování, takže něco takového:

if(state == BST_CHECKED) SendMessage(edit5, EM_SETPASSWORDCHAR, 0, FALSE);
else SendMessage(edit5, EM_SETPASSWORDCHAR, '*', FALSE);

SetFocus(edit5);
Nahlásit jako SPAM
IP: 188.75.135.–
ProXicT0
Návštěvník
17. 12. 2013   #4
-
0
-

#3 liborb
Ale když tam nastavím jako maskovací znak '*', tak to nebude vypadat jako všude jinde a je to nepřehledné. Když odešlu SendMessage(edit5, EM_SETPASSWORDCHAR, 0, FALSE);, tak se zobrazí text tak, jak má, ale po odškrtnutí bych tam chtěl opět ty tečky a ne hvězdičky, které se tam zobrazí pokud odešlu SendMessage(edit5, EM_SETPASSWORDCHAR, '*', FALSE);

Nahlásit jako SPAM
IP: 77.240.98.–
ProXicT0
Návštěvník
17. 12. 2013   #5
-
0
-

#2 z
Zkoušel jsem, návratová hodnota je ascii kód znaku..když ho vypíšu, tak se rovná 9679, což je ascii hodnota pro '¤', ale do eitboxu se mi vypíše 'Ď'

Nahlásit jako SPAM
IP: 77.240.98.–
Radek Chalupa
~ Redaktor
+1
Super člen
17. 12. 2013   #6
-
0
-

#5 ProXicT
Zřejmě projekt překládáš pro Unicode. 9679 rozhodně nemůže být hodnota pro '¤', protože to je konstanta typu char, tj. 1 bytový, tj 0-255, rep. -127 až +127. Musíš to zadat jako L'*' a ještě lépe po nastavení stylu password si pomocí EM_GETPASSWORDCHAR uložit vrácenou hodnotu do wchar_t (popř. TCHAR) a tu pak použít jako wparam zprávy WM_SETPASSWORDCHAR.

Radek Chalupa 
- vývoj software na zakázku 
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC) 
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
ProXicT0
Návštěvník
17. 12. 2013   #7
-
0
-

#6 Radek Chalupa
Návratová hodnota pro WM_GETPASSWORDCHAR je LRESULT (číslo), které má být ascii hodnotou danného znaku. Když tu návratovou hodnotu uložím do wchar_t nebo do TCHAR, tak se heslo nezamaskuje vůbec.
 

if(state == BST_CHECKED)
						   {
							   SendMessage(edit5, EM_SETPASSWORDCHAR, FALSE, FALSE);
							   SetFocus(edit5);
						   }
						   else
						   {
							   TCHAR passchar = SendMessage(edit5, EM_GETPASSWORDCHAR, FALSE, FALSE);//
							   MessageBox(NULL, (LPCSTR)passchar, NULL, MB_OK); // Zapomněl jsem přpsat, že toto mám přímo pod vytvořením edit5
							   SendMessage(edit5, EM_SETPASSWORDCHAR, (WPARAM)passchar, FALSE);
							   SetFocus(edit5);
						   }
Nahlásit jako SPAM
IP: 77.240.98.–
ProXicT0
Návštěvník
17. 12. 2013   #8
-
0
-

Tak už jsem zjistil, že defaultní znak ES_PASSWORD je (●) což je hexadecimální hodnota (0x25cf), ale když to odešlu editboxu, tak mi to zobrazí buď jako otazníky, nebo jako 'D'.
Zkoušel jsem to oedslat jako wchar_t, TCHAR, vložil jsem tam přímo tu hexadecimální hodnotu, zkoušel jsem odeslat přímo ten znak, pak L'●', ale pořád nic.

Nahlásit jako SPAM
IP: 77.240.98.–
Radek Chalupa
~ Redaktor
+1
Super člen
17. 12. 2013   #9
-
0
-

#8 ProXicT
Problém může být ve fontu který má nastaven ten dialog. Pokud je font dialogu (lze nastavit v resource editoru) MS Shell Dlg(8), mělo by se to zobrazovat správně.

Radek Chalupa 
- vývoj software na zakázku 
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC) 
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
ProXicT0
Návštěvník
17. 12. 2013   #10
-
0
-

Font nastavuji takto:

 

LOGFONT LogFont;
                      HFONT font;
                      LogFont.lfHeight = 14;
                      LogFont.lfWidth = 0;
                      LogFont.lfEscapement = 0;
                      LogFont.lfOrientation = 0;
                      LogFont.lfWeight = 0;
                      LogFont.lfCharSet = OEM_CHARSET;
                      LogFont.lfItalic = 0;
                      LogFont.lfUnderline = 0;
                      LogFont.lfStrikeOut = 0;
                      LogFont.lfCharSet = 0;
                      font = CreateFontIndirect(&LogFont);

edit5 = CreateWindow(TEXT("EDIT"), TEXT(""), WS_VISIBLE | WS_CHILD | ES_PASSWORD, RESx2 / 2 - 60, 30 + 35 + 35, 120, 15, hwnd2, (HMENU)ID_EDIT5, NULL, NULL);
                      SendMessage(edit5, WM_SETFONT, (WPARAM)font, TRUE);
Nahlásit jako SPAM
IP: 77.240.98.–
Radek Chalupa
~ Redaktor
+1
Super člen
17. 12. 2013   #11
-
0
-

#10 ProXicT
Tak jsem to zkusil na výchozí vygenerované win32 aplikaci (VS2008) a zobrazuje se to zcela správně:

// V inicializaci aplikace
  hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }
   _hedit = CreateWindowEx(0, WC_EDIT, L"test", WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_PASSWORD | WS_VISIBLE, 10, 10, 150,28, hWnd, NULL, hInstance, NULL);
   _znak_heslo = SendMessage(_hedit, EM_GETPASSWORDCHAR, 0, 0);

// Test v proceduře okna
	case WM_LBUTTONDOWN:
		if (SendMessage(_hedit, EM_GETPASSWORDCHAR, 0, 0) == 0)
			SendMessage(_hedit, EM_SETPASSWORDCHAR, _znak_heslo, 0);
		else
			SendMessage(_hedit, EM_SETPASSWORDCHAR, 0, 0);
		break;

Aby se zobrazovala "velká tečka" místo hvězdičky je potřeba nastavit tzv. manifest:

v stdafx.h:

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

Radek Chalupa 
- vývoj software na zakázku 
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC) 
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
ProXicT0
Návštěvník
17. 12. 2013   #12
-
0
-

#11 Radek Chalupa
Ve svém hlavičkovém souboru nastavuji manifest takto:
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
Když jsem zkoušel nastavit manifest podle vás, tak se mi všechny tlačítka vykreslují starým vzhledem a v editboxu se zobrazuje hvězdička zároveň s textem. 

Nahlásit jako SPAM
IP: 77.240.98.–
ProXicT0
Návštěvník
18. 12. 2013   #13
-
0
-

MÁM TO!!!! 
Řešení:
SendMessageW(edit5, EM_SETPASSWORDCHAR, (WPARAM)0x25CF, FALSE);

Pouze jsem si chtěl zobrazit, jaké parametry funkce přijímá, tak jsem dopsal W za SendMessage vidím, že všechno je na správném místě, divím se proč to nefunguje, tak jsem to zkompiloval; a helé už to funguje :D
Mám vážně radost ;-) I tak vám všem moc díky za pomoc :-)

Nahlásit jako SPAM
IP: 77.240.98.–
Radek Chalupa
~ Redaktor
+1
Super člen
18. 12. 2013   #14
-
+1
-
Zajímavé

#13 ProXicT
Znamená to že máš nastavenou kompilaci pro ANSI (jednobytové znaky) a SendMessage je pak ve skutečnosti SendMessageA, která podle všeho vezme pouze 1 byte z wparam. Tím že jsi použil SendMessageW, dostal jsi celý unicode znak.

Radek Chalupa 
- vývoj software na zakázku 
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC) 
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
ProXicT0
Návštěvník
18. 12. 2013   #15
-
0
-

#14 Radek Chalupa
Nastavil jsem si kompilaci pro unicode. Koukám, že to řeší více jak jeden problém, díky ;-)

Nahlásit jako SPAM
IP: 77.240.98.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 29 hostů

Podobná vlákna

Enter v editboxu — založil Tom9k

Win32 API — založil survik1

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý