Win32 API

Programovacie jazyky, rady, poradňa...
psm
Amateur
Amateur
Príspevky: 29
Registrovaný: 04 apr 2010, 0:59

Win32 API

Príspevok od používateľa psm »

Caute, pokusam sa spravit dialogove okno, kde by sa hned po zapnuti dal pisat text a po stlaceni Enter, by sa text ulozil a dialogove okno by sa vyplo. Ale mam mensi problem. Visual C++ nema resource editor. A ked si subory .rc a .h vytvorim cez ResEdit, tak mi vypise: Resource Editing in not supported on the Visual C++ Express SKU. Mam problem s tym, ze neviem presne ako tieto dva subory vytvorit. Mohli by ste mi prosim Vas poradit? Ja neportrebujem ani IDC_MAIN ani ID_ABOUT. NAJVACSI PROBLEM JE, ZE MAM IBA VC++ EXPRESS EDITION, takze mi tam nejde nacitat ani tu kniznicu "afxres.h".

subor.h

Kód: Vybrať všetko

#define IDR_MAIN                 101
#define IDC_MAIN                        102
#define IDR_MAINMENU                    103
#define ID_END                          40001
#define ID_ABOUT                        40002

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        104
#define _APS_NEXT_COMMAND_VALUE         40003
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif
subor.rc

Kód: Vybrať všetko

#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Czech resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY)
#ifdef _WIN32
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
#pragma code_page(1250)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAIN                ICON    DISCARDABLE     "HonzaNew.ico"

/////////////////////////////////////////////////////////////////////////////
//
// Cursor
//

IDC_MAIN                CURSOR  DISCARDABLE     "Příroda šipka.cur"

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDR_MAINMENU MENU DISCARDABLE 
BEGIN
    POPUP "&Soubor"
    BEGIN
        MENUITEM "&Konec",                      ID_END
    END
    POPUP "&Nápověda"
    BEGIN
        MENUITEM "O programu",                  ID_ABOUT
    END
END

#endif    // Czech resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED
Upraveny zdrojovy kod vyzera nasledovne:

Kód: Vybrať všetko

#include "main.h"
#include "resource.h"

#define _MainClassName TEXT("WinAPIMainClass")
#define _AppName TEXT("WinAPI")


LRESULT CALLBACK WindowProcMain(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	TCHAR chText[200];
	switch ( message )
	{
		case WM_CLOSE:
			if ( MessageBox(hwnd, TEXT("Naozaj skončit?"), _AppName,
				MB_YESNO | MB_ICONQUESTION) != IDYES )
				return 0;

			break;
		case WM_COMMAND:
			switch ( LOWORD(wParam) )
			{
				case ID_END:
					SendMessage(hwnd, WM_CLOSE, 0, 0);
					DestroyWindow(hwnd);
					break;
			}
			if ( lParam == (LPARAM)g_hwndButton1 )
			{
				GetWindowText(g_hwndEdit, chText, 200);
				MessageBox(g_hwndMain, chText, TEXT("Obsah editačného poľa"), MB_ICONINFORMATION);
			}
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
}
	return DefWindowProc(hwnd, message, wParam, lParam);
}

TCHAR ch[20];

BOOL InitApp()
{
	WNDCLASSEX wc;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
	wc.hCursor = LoadCursor(g_hInstance, MAKEINTRESOURCE(IDC_MAIN));
	wc.hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDR_MAIN));
	wc.hIconSm = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDR_MAIN));
	wc.hInstance = g_hInstance;
	wc.lpfnWndProc = WindowProcMain;
	wc.lpszClassName = _MainClassName;
//	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	if ( !RegisterClassEx(&wc) )
		return FALSE;

	g_hwndMain = CreateWindowEx(0, _MainClassName,
		_AppName,
		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		100, 100, 350, 250,
		NULL, 
		LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MAINMENU)),
		g_hInstance, NULL);
	if ( g_hwndMain == NULL )
		return FALSE;

// vytvoření dětských oken
	g_hwndEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
		TEXT("EDIT"),
		TEXT(""),
		WS_CLIPCHILDREN | WS_CHILDWINDOW | WS_VISIBLE,
		10, 15, 200, 25,
		g_hwndMain,
		(HMENU)NULL,
		g_hInstance,
		NULL);
	if ( g_hwndEdit == NULL )
		return FALSE;

	g_hwndButton1 = CreateWindowEx(0,
		TEXT("BUTTON"),
		TEXT("Text?"),
		WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
		10, 50, 75, 25,
		g_hwndMain,
		(HMENU)NULL,
		g_hInstance,
		NULL);
	if ( g_hwndButton1 == NULL )
		return FALSE;
	

	g_hwndEnd = CreateWindowEx(0,
		TEXT("BUTTON"),
		TEXT("Koniec"),
		WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
		95, 50, 75, 25,
		g_hwndMain,
		(HMENU)ID_END,
		g_hInstance,
		NULL);
	if ( g_hwndEnd == NULL )
		return FALSE;
	
	return TRUE;
}

MSG msg;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShow)
{
	g_hInstance = hInstance;
	if ( !InitApp() )
		return FALSE;
	while ( GetMessage(&msg, NULL, 0, 0) )
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Win32 API

Príspevok od používateľa audiotrack »

neskúšal si použiť nejaký externý resource editor? Napríklad resource hacker je free a celkom jednoduchý: http://www.angusj.com/resourcehacker/
psm
Amateur
Amateur
Príspevky: 29
Registrovaný: 04 apr 2010, 0:59

Re: Win32 API

Príspevok od používateľa psm »

audiotrack napísal:neskúšal si použiť nejaký externý resource editor? Napríklad resource hacker je free a celkom jednoduchý: http://www.angusj.com/resourcehacker/
No nakoniec som program upravil nasledovne, vsetko nepotrebne, ako napr. Menu som odstranil a dostal som z toho nasledovne:
Len problem je zase v tom, ze program sice skompiluje dobre, ale nic nespusti. Vedeli by ste mi poradit, cim to moze byt? Dik

Kód: Vybrať všetko

#include "main.h"
#include "resource.h"

#define _MainClassName TEXT("WinAPIMainClass")
#define _AppName TEXT("Učíme se WinAPI")

HINSTANCE g_hInstance;
HWND g_hwndMain;
HWND g_hwndEnd;
HWND g_hwndButton1;
HWND g_hwndEdit;

void centerText(HDC hdc)
{
	RECT rect;
	GetClientRect(g_hwndMain, &rect);
	SetBkMode(hdc, TRANSPARENT);
	NULL,
		NULL;
}

void OnWM_PAINT()
{
	PAINTSTRUCT ps;
	HDC hdc;
	hdc = BeginPaint(g_hwndMain, &ps);
	centerText(hdc);
	DrawIcon(hdc, 10,10,
		(HICON)GetClassLongPtr(g_hwndMain, GCLP_HICON));
	EndPaint(g_hwndMain, &ps);
}

LRESULT CALLBACK WindowProcMain(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	TCHAR chText[200];
	switch ( message )
	{
		case WM_CLOSE:
			if ( MessageBox(hwnd, TEXT("Opravdu končit?"), _AppName,
				MB_YESNO | MB_ICONQUESTION) != IDYES )
				return 0;

			break;
		case WM_COMMAND:
			if ( lParam == (LPARAM)g_hwndButton1 )
			{
				GetWindowText(g_hwndEdit, chText, 200);
				MessageBox(g_hwndMain, chText, TEXT("Obsah editačního pole"), MB_ICONINFORMATION);
			}
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
}
	return DefWindowProc(hwnd, message, wParam, lParam);
}

TCHAR ch[20];

BOOL InitApp()
{
	WNDCLASSEX wc;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
	NULL;
	wc.hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDR_MAIN));
	wc.hIconSm = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDR_MAIN));
	wc.hInstance = g_hInstance;
	wc.lpfnWndProc = WindowProcMain;
	wc.lpszClassName = _MainClassName;
//	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	if ( !RegisterClassEx(&wc) )
		return FALSE;

	g_hwndMain = CreateWindowEx(0, _MainClassName,
		_AppName,
		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		100, 100, 350, 250,
		NULL, 
		NULL,
		g_hInstance, NULL);
	if ( g_hwndMain == NULL )
		return FALSE;

// vytvoření dětských oken
	g_hwndEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
		TEXT("EDIT"),
		TEXT(""),
		WS_CLIPCHILDREN | WS_CHILDWINDOW | WS_VISIBLE,
		10, 15, 200, 25,
		g_hwndMain,
		(HMENU)NULL,
		g_hInstance,
		NULL);
	if ( g_hwndEdit == NULL )
		return FALSE;

	g_hwndButton1 = CreateWindowEx(0,
		TEXT("BUTTON"),
		TEXT("Text?"),
		WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
		10, 50, 75, 25,
		g_hwndMain,
		(HMENU)NULL,
		g_hInstance,
		NULL);
	if ( g_hwndButton1 == NULL )
		return FALSE;
	

	g_hwndEnd = CreateWindowEx(0,
		TEXT("BUTTON"),
		TEXT("Konec"),
		WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
		95, 50, 75, 25,
		g_hwndMain,
		(HMENU)NULL,
		g_hInstance,
		NULL);
	if ( g_hwndEnd == NULL )
		return FALSE;
	
	return TRUE;
}

MSG msg;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShow)
{
	g_hInstance = hInstance;
	if ( !InitApp() )
		return FALSE;
	while ( GetMessage(&msg, NULL, 0, 0) )
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
Pricom do .rc suboru som dal tiez iba potrebne veci a teda vytvorenie spustacej ikony a dostal som daco taketo:

resource.h

Kód: Vybrať všetko

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define IDR_MAIN                                101
main.rc

Kód: Vybrať všetko

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"


//
// Icon resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDR_MAIN           ICON           "icon1.ico"
//autoeditácia príspevku (25 Apr 2010, 14:08)
No tak uz som to vyriesil.:D Som odstranil o jeden riadok navyse. :D Ale stale neviem ako spravit, aby mi to okienko na zapis zobrazilo priamov hlavnom dialogovom okne, pri pouziti tohoto stylu: WS_CLIPSIBLINGS. Neviete mi s tym pomoct? :?
Takto vyzera vytovreni hlavneho okna.

Kód: Vybrať všetko

g_hwndMain = CreateWindowEx(0, _MainClassName,
		_AppName,
		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		100, 100, 350, 250,
		NULL, 
		NULL,
		g_hInstance, NULL);
	if ( g_hwndMain == NULL )
		return FALSE;

	g_hwndEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
		TEXT("EDIT"),
		TEXT(""),
		WS_CLIPSIBLINGS | WS_VISIBLE | ES_LEFT,
		10, 15, 200, 25,
		g_hwndMain,
		(HMENU)NULL,
		g_hInstance,
		NULL);
	if ( g_hwndEdit == NULL )
		return FALSE;
A zobrazi sa mi to takto:
Prílohy
Untitled2.jpg
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: Win32 API

Príspevok od používateľa c-ice »

nebolo by jednoduchšie si dat plnohodnotný Visual studio ??? a tam si to naklikáš podstatne rýchlejšie aspon to co chceš aby robilo je asi tak na 30minut ... ak chodiš na vysoku tak niektore ti ho daju... ak nie tak je tu stale možnost na nie az tak free verziu :psssst: alebo prejst na uplne ine IDE a napr. sa hrat z Qt aplikaciami...
psm
Amateur
Amateur
Príspevky: 29
Registrovaný: 04 apr 2010, 0:59

Re: Win32 API

Príspevok od používateľa psm »

No ale 30 min, pre koho? :D Lebo ja som s tym v zivote nerobil, ale ak by to bolo take lahke, tak prejdem na vyssiu verziu, lebo ja studujem na vyske.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Win32 API

Príspevok od používateľa audiotrack »

30 minút pre niekoho kto s tým nikdy nerobil a ešte sa to len chystá inštalovať (lebo zrejme do toho zarátal aj inštaláciu keďže ja to vidím na 5 minúty maximálne.)
psm
Amateur
Amateur
Príspevky: 29
Registrovaný: 04 apr 2010, 0:59

Re: Win32 API

Príspevok od používateľa psm »

A myslite, ze sa v tom da spravit aj tak, ze by sa to jednou klavesou ukladalo a aj sa nou ukoncoval ten program?
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: Win32 API

Príspevok od používateľa c-ice »

samozrejme ze sa to da spravit na jeden button
ked mas dialog vygenerovany tak tam mas tlacitko OK ono ma event onclick ktoremu je priradena nejaka funkcia bud ju z edituješ a pridas si tam potrebny kod na ukladanie do suboru alebo tlacitko nahradis vlastnym nastavis ho v designe ako default a zavola sa event ktomuto tlacitku (vytvoris 2xklik na tlacitko v resource editore) a vnom vykonas ulozenie a potom zavolas funkciu pre tlacitko OK
to aby si nacital text z multiline EditBoxu si najdi... niekde som tu kedysi uverejnil par videi ako na to..
Napísať odpoveď