Problem se stringem ve windows form – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problem se stringem ve windows form – C / C++ – Fórum – Programujte.comProblem se stringem ve windows form – C / C++ – Fórum – Programujte.com

 

MiCizek0
Stálý člen
20. 11. 2012   #1
-
0
-

Ahoj mám problém s touto částí kodu.  Konkrétně na "DirectoryInfo^ directoryInfo = gcnew DirectoryInfo (stringDirectory);" Při zpuštění programu mě to upozorňuje na špatný formát stringu, ale program běží dál.


private: System::Void textBoxDirectoryPlugins_TextChanged(System::Object^  sender, System::EventArgs^  e) {
			 String^ stringDirectory = directoryOfPlugins->ToString ();
			 DirectoryInfo^ directoryInfo = gcnew DirectoryInfo (stringDirectory);
			 /*array<System::IO::FileInfo^>^ arrayMaster = directoryInfo->GetFiles ("*.esm");
			 array<System::IO::FileInfo^>^ arrayPlugins = directoryInfo->GetFiles ("*.esp");
			 delete directoryInfo;*/
		 }
Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
20. 11. 2012   #2
-
0
-

#1 MiCizek
Možná chce unicode stringy, tj. L"Nějaký text"

Ale s tímhle raději do .NET diskuse, tam ti spíš někdo odpoví..

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: 213.220.211.–
MiCizek0
Stálý člen
20. 11. 2012   #3
-
0
-

Počkat já programuju NET? Já myslel, že je to C++. No ukazatele se zapisujou trochu jinak, jinak jsem si dalších rozdílů moc nevšiml.

Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
20. 11. 2012   #4
-
0
-

#3 MiCizek
Je to C++/CLI podle toho kódu, což je nadstavba nad C++ pro aplikace v .NETu    Zřejmě jsi založil WinForms aplikaci, což není nativní win aplikace.

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: 213.220.211.–
ingiraxo+15
Grafoman
20. 11. 2012   #5
-
0
-

ukazatele se nezapisujou jinak, ten XOR je tam díky GC, aby se při kompilaci poznalo, co patří do GC a co ne

C++/CLI je úplně něco jinýho, ty sis možná založil c++, ale jakmile přidáš form, tak se automaticky upravuje projekt na CLR a přidává se .NET

form pro win32 nemá žádnej desinger ani přímo něco, čemu se dá říkat form, vše si musíš vytvořit ručně

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Radek Chalupa
~ Redaktor
+1
Super člen
20. 11. 2012   #6
-
0
-

#5 ingiraxo
Zase tak úplně všechno ručně ne  . Ve win32 aplikaci existují tzv. resources, kde můžou být mj. popisy dialogových oken (tj. něco jako "form") a ty umožňuje vytvářet vizuálně každý běžný resource editor, v MS Visual C++ je samozřejmě resource editor součástí. Samozřejmě nejde tam naklikat např. barvy tlačítek, fonty apod. ale to co lze vytvořit v kódu pomocí stylů okna tak "naklikat" lze.

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: 213.220.211.–
MiCizek0
Stálý člen
20. 11. 2012   #7
-
0
-

Takže počkat, když to mám v C++/CLI, tak všechno vytvářím v týhle nástavbě? A když budu potřebovat poradit, kam mám napsat? Zatím jsem v tom vytvořil program, který mi načte a zobrazí v checkListBoxu všechny soubory v určitým adresáři s určitou koncovkou. Ale stále mám problém s tým stringem musím ho tam zadat ručně, ale né přes textbox.

Nahlásit jako SPAM
IP: 90.180.175.–
ingiraxo+15
Grafoman
20. 11. 2012   #8
-
0
-

#6 Radek Chalupa
no dobře, né úplně všechno ale velkou část je potřeba psát ručně, hlavně "editory" na resources byvaji dost chudy a mám dojem, že ani události přes něj nejdou spravovat, takže opět ručně

MiCizek piš do .NET, tohle opravdu s C++ má společný jen základní struktůru, ale jinak všechno taháš z .NETu: .. stringy tam máš jako String^, není problém ho zadat přes TextBox (String^ str = tb->Text)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Radek Chalupa
~ Redaktor
+1
Super člen
21. 11. 2012   #9
-
0
-

#7 MiCizek
Čemu říkáš "zadat ručně"?

Jinak pokud nejsi nucený psát v .NET, vycouvej dokud je čas  . .NET je vhodný pro nějaké databázové aplikace nad SQL serverem a pro webové stránky (aspx) a pak to piš v C# - synataxe je podobná jako v C++ a nebudeš alespoň prznit normální C++ .NETem. Zmíněné načtení souborů dané přípony z adresáře je v C a WinAPI banální záležitost, sice je to o něco víc řádků kódu ale nic těžkého (FindFirstFile, FindNextFile atd...)

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: 213.220.211.–
MiCizek0
Stálý člen
21. 11. 2012   #10
-
0
-

Čemu říkáš "zadat ručně"

Zadat umístění do textboxu a v listboxu se mi zobrazej ty pluginy. To mě už fungovalo až na ten string.

Co takhle to zkusit programovat v QT?

Nahlásit jako SPAM
IP: 90.180.175.–
ingiraxo+15
Grafoman
21. 11. 2012   #11
-
0
-

programuj v tom v čem tě to baví... Qt je jen další framework, kterej se docela podobá .NET, sice některý objekty mají trochu odlišnej název, ale princip je stejnej.. hlavně u něj je problém, že všude musíš tahat libky, protože windows nemá Qt a knihovna pro GUI třeba ma kolem 12MB, takže celá app má kolem 15MB.. ale dobře se v tom dělá Widget, to zas jo

v první řadě si vůbec musíš říct, co vlastně chceš programovat.. jak, v čem apod.

a jak říkal Radek, tak pokud .NET tak C# a né C++/CLI, je to celkem jednoduchej a pěknej jazyk

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Radek Chalupa
~ Redaktor
+1
Super člen
21. 11. 2012   #12
-
0
-

#10 MiCizek
Není problém v tom že ta třída DirectoryInfo si kontroluje parametr (co zadáváš v konstruktoru) zda je to platný název cesty? A pokud jak odhaduji reaguješ na každou změnu textu znak po znaku tak v určitém okamžiku tam je něco neplatného. Nevím z hlavy jak v .NETu, ale určitě tam bude nějaká metoda na zjištění zda daný text představuje platnou cestu, jako ve WinAPI jsou fce PathFileExists a PathIsDirectory. Takže nejprve otestovat a pak teprve pustit do té třídy DirectoryInfo.

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: 213.220.211.–
ingiraxo+15
Grafoman
21. 11. 2012   #13
-
0
-

sice to patří do .netu, ale pokud chceš zkontrolovat existenci adresare, tak jako 

if (Directory::Exists(cesta)) { ... }

pokud chceš souboru, tak místo Directory dej File

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
MiCizek0
Stálý člen
22. 11. 2012   #14
-
0
-

Ahoj, díky. C# vypadá jednoduše a podobně jako C++. Akorát asi nemá operátor delete, že? :-D V podstatě chci vytvořit program, který pracuje se soubory. Vyhledává v nich a načítá stringy, které pak převádí a ukládá do členských proměných, které se pak dají v grafickém rozhraní programu dále upravovat. A pak hodnoty zase převede na stringy a uloží změněné do dokumentu. V podstatě editor. Samozřejmě by také měly být v programu nějaké algoritmy, které s daty nějak pracují. Moc se nevyznám ve vašem slovníku, tak doufám, že jsem to řekl srozumitelně. :-D

Nahlásit jako SPAM
IP: 90.180.175.–
ingiraxo+15
Grafoman
22. 11. 2012   #15
-
0
-

v C++/CLI pokud budeš používat vše z .NET, tak nepotřebuješ ani delete, on má stejně jako C# GC, kterej se stará o automatickou správu paměti (někdy výhoda i nevýhoda)

takže app načte soubory (tipuju textový soubory) a ty upravíš v tom editoru obsah a zas uložíš?

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
MiCizek0
Stálý člen
22. 11. 2012   #16
-
0
-

takže app načte soubory (tipuju textový soubory) a ty upravíš v tom editoru obsah a zas uložíš?

Ano přesně, šlo to popsat jednou větou. :-D

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
22. 11. 2012   #17
-
0
-

On to text je, ale asi jako obrázek. Prostě se jedná o určitý dokument.

Nahlásit jako SPAM
IP: 90.180.175.–
ingiraxo+15
Grafoman
22. 11. 2012   #18
-
0
-

si projdi všechny soubory a postupně si je otevři (pokud umíš aspon trochu pracovat se soubory)

jinak můžeš použít třeba i  

string text = File.ReadAllText("soubor.txt");

pokud stále používáš C++/CLI, tak místo "." je "::" a string jako String^

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
MiCizek0
Stálý člen
22. 11. 2012   #19
-
0
-

Pokud by to nevadilo, že bych otvýral soubory, který mají i několik stovek MB. Jinak co neumím, můžu se naučit. Nějak začít musím. :-D

Nahlásit jako SPAM
IP: 90.180.175.–
ingiraxo+15
Grafoman
22. 11. 2012   #20
-
0
-

já nějak nerozumim tomu, proč by si otevíral binární soubory nebo co by si v nich chtěl měnit...

pokud chceš otevřít takhle velkej soubor, tak to musíš přes stream a počitej s tím, že 500MB soubor ti sežere 500MB+ paměti.. pokud ho teda hodláš zobrazit do toho tvého editoru

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Radek Chalupa
~ Redaktor
+1
Super člen
22. 11. 2012   #21
-
0
-

#19 MiCizek
Na tohle bych rozhodně doporučil WinAPI a "čisté" C++. Přečti si v dokumentaci o paměťově mapovaných souborech, jsou to mj. funkce OpenFileMapping, MapViewOfFile ....

Ostatně i obyčejná enumerace souborů (pokud jich je významně velké množství) je přes FindFirstFile, FindNextFile.. znatelně rychlejší než pomocí těch (sice pohodlných) "adresářových kolekcí" v .NETu

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: 213.220.211.–
MiCizek0
Stálý člen
22. 11. 2012   #22
-
0
-

Ve hře Skyrim jsou soubory *.esp a *.esm, které se dají editovat. Tyto soubory obsahujou informace o hře, kde třeba "TREE" jsou objekty stromů. Tyto objekty mají některé proměnné třeba NAME + nějaké jméno. Pokud tam je nějaká proměnná, tak je většinou v binární podobě a ta se dá převíst na číslo. Dělám to hlavně proto, protože ke hře existuje ještě SkyrimScriptExtender, který třeba umožňuje přidávat do hry další třídy a metody a funkce (psanej v C++), tak si chcu vytvořit editor s kterým bych byl shopen s těmahle novejma prvkama pracovat a nebo přidat další prvky jako vytváření a vkládání určitých vzorů. Např. Někdo potřebuje pro svůj novej mod vytvořit 50 domů i s interiéry, tak aby každej dům nemusel sestavovat v editoru zvlášť.

http://code.google.com/p/skyrim-plugin-decoding-project/

http://skse.silverlock.org/

Já vím je to trochu ambiciozní, ale tyhle ty ambice mě motivovaly v C++ zvládnout i takové prvky jako ukazatele a odkazy. :-D

Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
22. 11. 2012   #23
-
0
-

#22 MiCizek
Vzhledem k tomu že pointer, resp. ukazatel je v NETu takřka sprosté slovo, nepohřbívej ty ambice a zůstaň u "nativního" C/C++    Znáš snad nějakou rozšířenou a populární hru např. která je napsaná v .NETu?..

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: 213.220.211.–
MiCizek0
Stálý člen
22. 11. 2012   #24
-
0
-

Miner Wars? Teď tím spamujou každou stránku o hrách. :-D

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
22. 11. 2012   #25
-
0
-

Jinak trochu mám v C++ strach z prvků jako Tree list a podobně. :-D

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
23. 11. 2012   #26
-
0
-
Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
23. 11. 2012   #27
-
0
-

#26 MiCizek
Můžeš samozřejmě, jenom ale tenhle článek je z už poměrně staré série kterou jsem psal kdysi pro "živě.cz" a oni to chtěli raději zabalit do MFC která byla v té době (před .NET) hodně populární a rozšířená. Takže nyní bych doporučil pokud objektovou knihovnu tak to zabalit co okenních tříd ATL nebo to psát jen v API, viz, obdobný článek v čistém API http://www.radekchalupa.cz/clanky/?kod=205&obsah=40, a celý seriál o API (psaný pro builder.cz kde je také k přečtení) http://www.radekchalupa.cz/clanky/?kod=213&obsah=1 a nebo kompletní v jedné stránce http://www.radekchalupa.cz/clanky/?kod=214&obsah=1

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: 213.220.211.–
MiCizek0
Stálý člen
23. 11. 2012   #28
-
0
-

tatím jsem to narychlo projel, takže listBox se může použít jako treeListBox?

Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
23. 11. 2012   #29
-
0
-

#28 MiCizek
Nevím čemu (nějaká komponenta z NETu?) říkáš treeListBox, ale mezi standardní ovládací prvky je např. "Tree-View" a "List-View", to jsou například okna v Průzkumníku, tree-view je to vlevo.

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: 213.220.211.–
MiCizek0
Stálý člen
23. 11. 2012   #30
-
0
-

Promiňte, že to ze mě leze jak z chlupatý deky. Samozřejmě znám funkci CreateWindow


	case WM_CREATE:
		HWND hwndTV;
		HWND hwndParent;
		RECT rcClient; 
		GetClientRect(hwndParent, &rcClient); 
		hwndTV = CreateWindowEx(0,WC_TREEVIEW, TEXT("Tree View"), WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES,0,  0,rcClient.right, rcClient.bottom,hWnd, (HMENU)ID_TREEVIEW, hInst, NULL); 
		break;

jen mám problémy s tímto kodem, jestly mě tam chybí knihovna nebo něco jiného. Hlásí mě to problém u WC_TREEVIEW a TVS_HASLINES.

Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
24. 11. 2012   #31
-
0
-

#30 MiCizek
Chybí jen includovaný příslušný hlavičkový soubor, v tomhle případě konkrétně commctrl.h.

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: 213.220.211.–
MiCizek0
Stálý člen
24. 11. 2012   #32
-
0
-

Díky a teď jenom takovej kosmetickej dotaz. Jakej je rozdíl mezi #include "blabla" a #include <blabla>?

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
24. 11. 2012   #33
-
0
-

Ahoj, čím to může být, když vytvářím druhé okno, tak ho mám se všema prvkama jako první okno? V prvním oknu mám zatím TreeView a menu a stejné menu a TreeView mám i v druhém oknu.

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
24. 11. 2012   #34
-
0
-

Pokud jsem to přeložil správně tak HINSTANCE je datový typ obsahující adresu instance modulu. Takže pokud to chápu správně, tak se mi všechny prvky ukládají pod stejnou adresu instance a když otevřu jakékoliv okno, načtou se do něj všechny prvky dané adresy. Proto mi to dělá tohle. Mám deklarovaných více těchto (h jako HANDLE?), ale asi maj všechny nastavenou tu samou hodnotu. Tak pokud je to nějaký takový problém, mělo by existovat něco, co tu adresu nastaví. Kod jsem sem zatím nevkládal, protože předpokládám, že se jedná o nějakou běžnou nováčkovskou chybu. :-)

Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
25. 11. 2012   #35
-
0
-

#32 MiCizek
To co je v lomených závorkách překladač hledá ve standardních složkách nastavených ve vývojovém prostředí při instalaci. V uvozovkách může být relativní nebo absolutní cesta k existujícímu souboru (bez cesty je výchozí složka projektu). Může se to mírně lišit podle vývojového prostředí, tj, že hledá i "nadstandardně".

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: 213.220.211.–
Radek Chalupa
~ Redaktor
+1
Super člen
25. 11. 2012   #36
-
0
-

#34 MiCizek
Na adresu HINSTANCE se v zásadě nic neukládá, je na ní uložen obraz modulu (exe, dll) a je potřeba především při načítání resources (menu, dialogu, ikony,...), které jsou uloženy přímo v modulu a s výjimkou modifikace resources za běhu by se do toho prostoru paměti nemělo zasahovat.

Pokud jde o okna, tak jeho základní vlastnosti jsou určené při registraci třídy okna - viz. struktura WNDCLASSEX, takže každé nové okno kterému se při vytvoření zadá tato třída bude mít ve výchozím stavu stejné vlastnosti (ikona, pozadí, menu,...), ale s dětskými okny na něm umístěnými to nijak nesouvisí, takže (jak zmiňuješ v dotazu) menu ano, ale treeview nikoliv.

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: 213.220.211.–
MiCizek0
Stálý člen
25. 11. 2012   #37
-
0
-

Problém je, když se mi pošle zpráva IDM_LOADPLUGINS tak se mi otevře okno, které obsahuje úplně stejné prvky jako okno hlavní.

// Skyrim_Crystal_Editor.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "Skyrim_Crystal_Editor.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;		// current instance
HINSTANCE hTreehInst;
HINSTANCE hLoadPluginsInst;
TCHAR szTitle[MAX_LOADSTRING];					// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];			// the main window class name

// Forward declarations of functions included in this code module:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: Place code here.
	MSG msg;
	HACCEL hAccelTable;

	// Initialize global strings
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_SKYRIM_CRYSTAL_EDITOR, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SKYRIM_CRYSTAL_EDITOR));

	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SKYRIM_CRYSTAL_EDITOR));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_SKYRIM_CRYSTAL_EDITOR);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HINSTANCE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 0 , 0, 256, 768, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND	- process the application menu
//  WM_PAINT	- Paint the main window
//  WM_DESTROY	- post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		case IDM_LOADPLUGINS:
			 HWND hWndLoadPlugins;
			hLoadPluginsInst = (HINSTANCE)GetStdHandle(STD_INPUT_HANDLE);
			 hWndLoadPlugins = CreateWindow(szWindowClass, TEXT("Load Plugins"), WS_VISIBLE | WS_BORDER | WS_OVERLAPPEDWINDOW, 100 , 100, 512, 768, hWnd, NULL, hLoadPluginsInst, NULL);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_CREATE:
		HWND hwndTree;
		hwndTree = CreateWindowEx(0,WC_TREEVIEW, TEXT("Tree View"), WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES, 12, 12, 216, 682, hWnd, (HMENU)ID_TREEVIEW, hTreehInst, NULL); 
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}
Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
25. 11. 2012   #38
-
0
-

#37 MiCizek
Protože ty okna pluginů vytváříš od stejné třídy jako hlavní okno a tudíž mají mj. společnou i proceduru okna (WndProc v kódu) a jakmile dostanou zprávu WM_CREATE (ta přijde během vytváření okna) tak v její obsluze vytváříš ten treeview - úplně stejně pro všechny okna.

Jednoduše si pro okna pluginů zaregistruj jinou třídu s vlastní procedurou atd.

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: 213.220.211.–
MiCizek0
Stálý člen
25. 11. 2012   #39
-
0
-

Bezva, zdá se, že jsem se naučil zase něco nevého. Menu a treeview už se mi v druhém okně nezobrazuje. :-D

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
29. 11. 2012   #40
-
0
-

Ahoj má  winapi nějakou zprávu, která se odešle, když změním text v editboxu?

Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
29. 11. 2012   #41
-
0
-

#40 MiCizek
Samozřejmě, je to EN_CHANGE, přesně řečeno rodičovskému oknu přijde WM_COMMAND s tímhle notifikačním kódem.

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: 213.220.211.–
MiCizek0
Stálý člen
29. 11. 2012   #42
-
0
-

Jo tu zprávu jsem tam měl, akorát jako podmínku k message. Teď mám problém, že mi to spadne, když použiju SendMessage()

// Skyrim_Crystal_Editor.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "Skyrim_Crystal_Editor.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;		// current instance
HINSTANCE hTreeInst;
HINSTANCE hLoadPluginsInst;
TCHAR szTitle[MAX_LOADSTRING];					// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];			// the main window class name
TCHAR lpWindowClass[MAX_LOADSTRING];

HWND hWndLoadPlugins;
HWND hWndLoadPluginsDir;
HWND hWndListOfPlugins;
HWND hWndListOfParents;
HWND hWndDescription;
HWND hWndSetAsActive;
HWND hWndLoadButton;

// Forward declarations of functions included in this code module:
ATOM				MyRegisterClass(HINSTANCE hInstance);
ATOM				MyRegisterLoadPlugin(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	WndLPProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: Place code here.
	MSG msg;
	HACCEL hAccelTable;

	// Initialize global strings
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_SKYRIM_CRYSTAL_EDITOR, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);
	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SKYRIM_CRYSTAL_EDITOR));

	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SKYRIM_CRYSTAL_EDITOR));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_SKYRIM_CRYSTAL_EDITOR);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

ATOM MyRegisterLoadPlugin(HINSTANCE hInstance)
{
	WNDCLASSEX wloadp;

	wloadp.cbSize = sizeof(WNDCLASSEX);

	wloadp.style			= CS_HREDRAW | CS_VREDRAW;
	wloadp.lpfnWndProc		= WndLPProc;
	wloadp.cbClsExtra		= 0;
	wloadp.cbWndExtra		= 0;
	wloadp.hInstance		= hInstance;
	wloadp.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SKYRIM_CRYSTAL_EDITOR));
	wloadp.hCursor			= LoadCursor(NULL, IDC_ARROW);
	wloadp.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wloadp.lpszMenuName		= MAKEINTRESOURCE(IDC_LOAD_PLUGINS);
	wloadp.lpszClassName	= lpWindowClass;
	wloadp.hIconSm			= LoadIcon(wloadp.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wloadp);
}

//
//   FUNCTION: InitInstance(HINSTANCE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 0 , 0, 256, 768, NULL, NULL, hInstance, NULL);
   HWND hwndTree;
   hwndTree = CreateWindowEx(0,WC_TREEVIEW, TEXT("Tree View"), WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES, 12, 12, 216, 682, hWnd, (HMENU)ID_TREEVIEW, hTreeInst, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}
 
//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND	- process the application menu
//  WM_PAINT	- Paint the main window
//  WM_DESTROY	- post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		/*case IDM_LOADDIR:
			SetWindowText( hWndLoadPluginsDir, L"ahojghgnhyj vkjml,ploj,o;,njo,jv,bkl,j;lnb.b,jl;l.l;.kkmhnjgbhgbchjnjmkm" );
			break;*/
		case IDM_LOADPLUGINS:
			 hLoadPluginsInst = (HINSTANCE)GetStdHandle(STD_INPUT_HANDLE);
			 LoadString(hLoadPluginsInst, IDC_LOAD_PLUGINS, lpWindowClass, MAX_LOADSTRING); 
			 MyRegisterLoadPlugin(hLoadPluginsInst);
			 hWndLoadPlugins = CreateWindow(lpWindowClass, TEXT("Load Plugins"), WS_VISIBLE | WS_BORDER | WS_OVERLAPPEDWINDOW, 100 , 100, 512, 768, hWnd, NULL, hLoadPluginsInst, NULL);
			 hWndLoadPluginsDir = CreateWindowEx(0,L"EDIT", TEXT(""), WS_VISIBLE | WS_CHILD | WS_BORDER, 16, 32, 322, 24, hWndLoadPlugins, (HMENU)IDM_LOADDIR, hLoadPluginsInst, NULL);
			 hWndListOfPlugins = CreateWindowEx(0,L"LISTBOX", TEXT(""), WS_VISIBLE | WS_CHILD | WS_BORDER| LVS_EX_CHECKBOXES, 16, 72, 175, 575, hWndLoadPlugins, (HMENU)IDM_LOADLIST, hLoadPluginsInst, NULL);
			 hWndListOfParents = CreateWindowEx(0,L"LISTBOX", TEXT(""), WS_VISIBLE | WS_CHILD | WS_BORDER, 210, 72, 128, 175, hWndLoadPlugins, (HMENU)IDM_LOADPARENTS, hLoadPluginsInst, NULL);
			 hWndDescription = CreateWindowEx(0,L"STATIC", TEXT(""), WS_VISIBLE | WS_CHILD | WS_BORDER, 210, 253, 265, 384, hWndLoadPlugins, (HMENU)IDM_LOADDESCRIP, hLoadPluginsInst, NULL);
			 hWndSetAsActive = CreateWindowEx(0,L"BUTTON", TEXT("Set as Active"), WS_VISIBLE | WS_CHILD | WS_BORDER, 16, 675, 128, 24, hWndLoadPlugins, (HMENU)IDM_LOADSETASACT, hLoadPluginsInst, NULL);
			 hWndLoadButton = CreateWindowEx(0,L"BUTTON", TEXT("Load Plugins"), WS_VISIBLE | WS_CHILD | WS_BORDER, 210, 675, 128, 24, hWndLoadPlugins, (HMENU)IDM_LOADBUTTON, hLoadPluginsInst, NULL);
			 ShowWindow(hWndLoadPlugins, SW_SHOW);
			 UpdateWindow(hWndLoadPlugins);
			 break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_CREATE:
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
LRESULT CALLBACK WndLPProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_LOADDIR:
			if (wmEvent == EN_CHANGE)
			{
				SendMessage( hWndLoadPluginsDir, WM_SETTEXT, 0, (LPARAM)L"gghghhhjhjghjhghj");
			}
			break;
		/*default:
			return DefWindowProc(hWnd, message, wParam, lParam);*/
		}
		break;
	case WM_CREATE:
		break;
	case WM_INITDIALOG:
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}
Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
29. 11. 2012   #43
-
0
-

Předpokládám, že jsem použil špatnou funkci, když sendmessage provede změny, tak se znovu zavolá wm_command a tak stále dokola.

Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
30. 11. 2012   #44
-
0
-

#42 MiCizek
Tu notifikaci EN_CHANGE dostane parent toho editu a pokud se dobře dívám tak se ji snažíš zachytit v poceduře okna přímo toho editu.

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: 213.220.211.–
MiCizek0
Stálý člen
3. 12. 2012   #45
-
0
-

Můžeš to trochu vysvětlit? Zkouším hledat na inernetu, ale bez menšího nakopnutí mám asi problém. Parent editu je rodičovské okno, ne?  Zde na msdn jsem našel tohle. http://msdn.microsoft.com/en-us/library/windows/desktop/Hh768384%28v=vs.85%29.aspx Ale když lParam převedu na tuhletu structuru, tak mě to napíše, že tahle structura není deklarovaná. Kde na msdn můžu najít jakou hlavičku připojit nebo s čím slinkovat?

Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
4. 12. 2012   #46
-
0
-

#45 MiCizek


To co se popisuje v tom odkazu je o rich-editu.

EN_CHANGE je posílaná pouze když obsah editu změní uživatel, ale nikoliv pokud ho nastavíš programově. Ale hlavně by to měl detekovat ve WndProc, což je pokud se dobře dívám procedura rodiče toho editu.

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: 213.220.211.–
MiCizek0
Stálý člen
4. 12. 2012   #47
-
0
-

Aha, takže, když edit hodím WndLPProc, tak to pak můžu takle nechat? Akorát jsem myslel, že když se vytvoří nové okno, tak se volá WM_CREATE, asi ne.

Nahlásit jako SPAM
IP: 90.180.175.–
MiCizek0
Stálý člen
7. 12. 2012   #48
-
0
-

Jinými slovy jak to udělat, aby byl rodič WndLPProc.? :-D

Nahlásit jako SPAM
IP: 90.180.175.–
Radek Chalupa
~ Redaktor
+1
Super člen
7. 12. 2012   #49
-
0
-

#48 MiCizek
"Rodičem" je okno (HWND), nikoliv procedura okna. Prostě a jednoduše se notifikace EN_CHANGE musí odchytávat (detekovat) v té proceduře která přísluší oknu které je rodičem toho editu.

Zpráva WM_CREATE samozřejmě přijde (v průběhu vytváření okna) a to jednou pro každé vytvoření okna a v její obsluze musí být volání výchozího zpracování (DefWindowProc) aby došlo k úspěšnému vytvoření okna.

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: 213.220.211.–
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, 139 hostů

Podobná vlákna

Problem se stringem — založil ellke

Problém se stringem — založil MiCizek

Windows Form Application — založil George5

Windows form app — založil Mareoute

Windows form app — založil xmas7

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ý