Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z kreacją okna w WINAPI z kursu

Ostatnio zmodyfikowano 2021-03-03 18:35
Autor Wiadomość
slyys72
Temat założony przez niniejszego użytkownika
Problem z kreacją okna w WINAPI z kursu
» 2021-03-02 23:30:02
Witam,
zacząłem kurs WINAPI i po stworzeniu kodu zgodnie z kursem , kod sie nie kompiluje wywalając bład w linii 4:

C2440 "inicjowanie": nie można konwertować z "const char [14]" na "LPSTR"
E0144 nie można użyć wartości typu "const char *" do zainicjowania jednostki typu "LPSTR"
Jak to naprawić ? wstawiałem const, próbowałem wskaźnik ale nic nie działa. Może przez rzutowanie ????
To jest z kursu to powinno działac przecież :).

C/C++
#include <windows.h>
#include<string>

LPSTR NazwaKlasy = "Klasa Okienko";
MSG Komunikat;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
   
   
// WYPEŁNIANIE STRUKTURY
   
WNDCLASSEX wc;
   
   
wc.cbSize = sizeof( WNDCLASSEX );
   
wc.style = 0;
   
wc.lpfnWndProc = WndProc;
   
wc.cbClsExtra = 0;
   
wc.cbWndExtra = 0;
   
wc.hInstance = hInstance;
   
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
   
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
   
wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
   
wc.lpszMenuName = NULL;
   
wc.lpszClassName = NazwaKlasy;
   
wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
   
// REJESTROWANIE KLASY OKNA
   
if( !RegisterClassEx( & wc ) )
   
{
       
MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
       
MB_ICONEXCLAMATION | MB_OK );
       
return 1;
   
}
   
   
// TWORZENIE OKNA
   
HWND hwnd;
   
   
hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Oto okienko", WS_OVERLAPPEDWINDOW,
   
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL );
   
   
if( hwnd == NULL )
   
{
       
MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
       
return 1;
   
}
   
   
ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
   
UpdateWindow( hwnd );
   
   
// Pętla komunikatów
   
while( GetMessage( & Komunikat, NULL, 0, 0 ) )
   
{
       
TranslateMessage( & Komunikat );
       
DispatchMessage( & Komunikat );
   
}
   
return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
   
switch( msg )
   
{
   
case WM_CLOSE:
       
DestroyWindow( hwnd );
       
break;
       
   
case WM_DESTROY:
       
PostQuitMessage( 0 );
       
break;
       
       
default:
       
return DefWindowProc( hwnd, msg, wParam, lParam );
   
}
   
   
return 0;
}
P-178208
DejaVu
» 2021-03-02 23:57:34
Kurs jest bardzo wiekowy i zapewne ma jakieś błędy. W każdym razie:
LPSTR to nic innego jak char*.
LPCSTR to nic innego jak const char*.
Jeżeli wymagana jest gdzieś nie-constowa tablica znaków, to musisz mieć zdefiniowaną tablicę np. w stylu:
C/C++
char twojaZmienna[ 1234 ];
Następnie robisz do niej odwołanie:
C/C++
jakasFunkcja( twojaZmienna );
//lub:
jakasFunkcja( & twojaZminna[ 0 ] );
Można też zdefiniować rozmiar tablicy 'dynamicznie' przypisując do tego tekst:
C/C++
char twojazmienna[ ] = "Jakiś tekst";

PS. Łatwiej się udziela odpowiedzi, jeżeli podasz też linijkę w której wystąpił błąd. W przeciwnym wypadku możemy napisać Ci tylko interpretację komunikatu błędu.
P-178209
slyys72
Temat założony przez niniejszego użytkownika
» 2021-03-03 14:57:53
Błąd jest w linii nr 4 jak pisałem w poście .

C/C++
LPSTR NazwaKlasy = "Klasa Okienko";

Będę cos kombinował sam ale kiepsko to widzę :) .
P-178210
nanoant20
» 2021-03-03 15:41:29
tak jak wyżej pisał @DejaVu
zamiast LPSTR użyj następujących typów danych
LPTSTR reprezentuje char*
lub
LPCTSTR reprezentuje const char*

zamiast
LPSTR NazwaKlasy = "Klasa Okienko";
piszesz, np.
LPCTSTR NazwaKlasy = "Klasa Okienko";

const char lpText[] = TEXT("Okno odmówiło przyjścia na świat!");

MessageBox( NULL, lpText, "Ale kicha...", MB_ICONEXCLAMATION );
P-178211
slyys72
Temat założony przez niniejszego użytkownika
» 2021-03-03 16:46:24
Zastosowanie tych zmian pozbyło sie błędu z LPSTR i char.
Mimo wszystko dalej nie moge uruchomic tego okienka.
Teraz mam błędy :

wiersz nr 1:   LNK1120 liczba nierozpoznanych elementów zewnętrznych: 1
wiersz nr 1:   LNK2019 nierozpoznany symbol zewnętrzny _main przywołany w funkcji "int __cdecl invoke_main(void)"  
                        (?invoke_main@@YAHXZ) D:\Programy C++\Okienka\okno\MSVCRTD.lib(exe_main.obj)
wiersz nr 8:   C28251 Niespójna adnotacja dla „WinMain”: w tym wystąpieniu jest brak adnotacji. Patrz d:\windows kits\10\include\10.0.18362.0\um\winbase.h(933).  

Cały obecny kod:
C/C++
#include <windows.h>

LPCTSTR NazwaKlasy = TEXT( "Klasa Okienko" );
MSG Komunikat;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE HprevInstance, LPSTR plCmdLine, int nCmdShow )
{
   
   
WNDCLASSEX wc;
   
wc.cbSize = sizeof( WNDCLASSEX );
   
wc.style = 0;
   
wc.lpfnWndProc = WndProc;
   
wc.cbClsExtra = 0;
   
wc.cbWndExtra = 0;
   
wc.hInstance = hInstance;
   
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
   
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
   
wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
   
wc.lpszMenuName = NULL;
   
wc.lpszClassName = NazwaKlasy;
   
wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
if( !RegisterClassEx( & wc ) )
   
{
       
MessageBox( NULL, TEXT( "Wysoka komisja odmawia rejestracji tego okna!" ), TEXT( "Niestety..." ), MB_ICONEXCLAMATION | MB_OK );
       
return 1;
   
}
   
HWND hwnd;
   
hwnd = CreateWindowEx( WS_EX_WINDOWEDGE, NazwaKlasy, TEXT( "Interfejs Graficzny" ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 250, 250, NULL, NULL, hInstance, NULL );
   
if( hwnd == NULL )
   
{
       
MessageBox( NULL, TEXT( "Okno odmowilo przyjscia na swiat :(" ), TEXT( "Blad" ), MB_ICONEXCLAMATION );
       
return 1;
   
}
   
ShowWindow( hwnd, nCmdShow );
   
UpdateWindow( hwnd );
   
while( GetMessage( & Komunikat, NULL, 0, 0 ) )
   
{
       
TranslateMessage( & Komunikat );
       
DispatchMessage( & Komunikat );
   
}
   
return Komunikat.wParam;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
   
switch( msg )
   
{
   
case WM_CLOSE:
       
DestroyWindow( hwnd );
       
break;
   
case WM_DESTROY:
       
PostQuitMessage( 0 );
       
break;
       
       
default:
       
return DefWindowProc( hwnd, msg, wParam, lParam );
   
}
   
   
return 0;
}

Dodam tylko że jak tworzę okno automatycznie jako szablon wbudowany w Visual Studio 2019 wszystko działa.
Oczywiście tam kod szablonu jest inny .
Chciałbym jednak rozwikłać te zagadkę - dlaczego to z kursu się nie uruchamia ???
P-178212
nanoant20
» 2021-03-03 17:17:51
P-178213
slyys72
Temat założony przez niniejszego użytkownika
» 2021-03-03 18:35:56
To już była moja wina.
Źle tworzyłem pusty projekt aplikacji windows.

Temat zamknięty. Sprawa LPSTR rozwiązana.

Dziekuję za pomoc.
P-178214
« 1 »
  Strona 1 z 1