Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

проблем с код в С++

Featured Replies

Здрасти! Предварително се извинявам ако нещо не съм написал нещо както или където трябва,но съм нов в форума... 

Имам задача да напиша код за създаване на прозорец посредством Windows Api (C++) .Помагам си с една снимка от учебника,но е леко размазана и на няколко места се запичам доста.Повечето проблеми разреших обаче стигнах до някъде и незная какво да правя. 

#include <windows.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

   LRESULT CALLBACK WindowProc(HWND hWnd,    UINT Msg,
                            WPARAM wParam, LPARAM lParam)
     {
        MSG hdc;
        PAINTSTRUCT ps;
        RECT pect;
        switch (Msg)
        {
        case WM_DESTROY:  PostQuitMessage(0);   return 0;
        case WM_PAINT:  {
             BeginPaint(hWnd, &ps);
               GetClientRect(hWnd, &pect);
               DrawText(hdc,"hello", &pect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);    <-----------на този  ред ми е най-големия проблем   
               EndPaint(hWnd,&ps);
               return 0; )
        default ; breack ;
        )
        return DefWindowProg(hWund,Nsg,wParam,lParam);


//---------------------------------------------------------------------------

             int WINAPI WinMain
  (HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPSTR lpCmdLine,
  int nCmdShow)
{
      WNDCLASSEX WndClsEx;

      static char szAppName[]= "FirstClass";
     MSG       Msg;

  WndClsEx.cbSize   =sizeof(WndClsEx);
  WndClsEx.style    =CS_OWNDC  | CS_VREDRAW | CS_HREDRAW;
  WndClsEx.lpfnWndProc = WindowProc;
  WndClsEx.cbClsExtra = 0;
  WndClsEx.cbWndExtra = 0;
  WndClsEx.hInstance  = hInstance;
  WndClsEx.hIcon = LoadIcon(NULL,IDI_APPLICATION);
  WndClsEx.hCursor = LoadCursor(NULL,IDC_ARROW);
  WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  WndClsEx.lpszMenuName = NULL;
  WndClsEx.lpszClassName = szAppName;
  WndClsEx.hIconSm = LoadIcon(hInstance,IDI_APPLICATION);
         RegisterClassEx(&WndClsEx);

   CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
        szAppName, "My First Basic Win32 Application",
        WS_OVERAPPEDWINDOW  |WS_VISIBLE,   0,   0,   CW_USEDEFAULT,
        CW_USEDEFAULT,   NULL,    NULL,  hInstance,  NULL  );

  while ( GetMessage (&Msg, NULL, 0, 0) )
{
     TranslateMessage (&uMsg);
     DispatchMessage (&uMsg);
}

    )


}

 

сигурно и друго съм объркал ако има някой да ме светне кое не ми е както трябва ще съм много благодарен !!!!

 

 

  • Автор

не е само това проблема...пробвах различни варианти.По принцип гледам от едни размазани снимки и според това което виждам трябва на реда да е 

MSG hdc;
        PAINTSTRUCT ps;
        RECT pect;
        switch (Msg)
        {
        case WM_DESTROY:  PostQuitMessage(0);   return 0;
        case WM_PAINT:  {
             BeginPaint(hWnd, &ps);
               GetClientRect(hWnd, &rect);
               DrawText(hdc, "hello",..., &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);   <---- на мястото на многоточието пише нещо което не рачитам и незная какво да пиша...
                  

 

прикачам и цялата снимка...

 

20161029_131637.jpg

Докарах го до 2 грешки, за другите по-внимателно разгледай какво пише в снимките

#include <windows.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

   LRESULT CALLBACK WindowProc(HWND hWnd,    UINT Msg,
                            WPARAM wParam, LPARAM lParam)
     {
        MSG hdc;
        PAINTSTRUCT ps;
        RECT pect;
        switch (Msg)
        {
        case WM_DESTROY:  PostQuitMessage(0);   return 0;
        case WM_PAINT:  
             BeginPaint(hWnd, &ps);
             GetClientRect(hWnd, &pect);
             DrawText(hdc,"hello", &pect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);      
             EndPaint(hWnd,&ps);
             return 0; 
        default: break ;
        }
        return DefWindowProg(hWnd,Msg,wParam,lParam);
}

//---------------------------------------------------------------------------

int WINAPI WinMain
  (HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPSTR lpCmdLine,
  int nCmdShow)
{
      WNDCLASSEX WndClsEx;

      static char szAppName[]= "FirstClass";
     MSG       Msg;

  WndClsEx.cbSize   =sizeof(WndClsEx);
  WndClsEx.style    =CS_OWNDC  | CS_VREDRAW | CS_HREDRAW;
  WndClsEx.lpfnWndProc = WindowProc;
  WndClsEx.cbClsExtra = 0;
  WndClsEx.cbWndExtra = 0;
  WndClsEx.hInstance  = hInstance;
  WndClsEx.hIcon = LoadIcon(NULL,IDI_APPLICATION);
  WndClsEx.hCursor = LoadCursor(NULL,IDC_ARROW);
  WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  WndClsEx.lpszMenuName = NULL;
  WndClsEx.lpszClassName = szAppName;
  WndClsEx.hIconSm = LoadIcon(hInstance,IDI_APPLICATION);
  RegisterClassEx(&WndClsEx);

   CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
        szAppName, "My First Basic Win32 Application",
        WS_OVERLAPPEDWINDOW  |WS_VISIBLE,   0,   0,   CW_USEDEFAULT,
        CW_USEDEFAULT,   NULL,    NULL,  hInstance,  NULL  );

  while ( GetMessage (&Msg, NULL, 0, 0) )
  {
     TranslateMessage (&Msg);
     DispatchMessage (&Msg);
  }


}

 

Редактирано от ined (преглед на промените)

Мисля, че на мястото на точките, трябва да е дължината на стринга "hello". Число, или strlen("hello"). 

edit: На снимката май е -1. Според това, ако е -1, се пресмятат автоматично. 

Редактирано от eXceLLen7 (преглед на промените)

преди 1 час, eXceLLen7 написа:

Мисля, че на мястото на точките, трябва да е дължината на стринга "hello". Число, или strlen("hello"). 

edit: На снимката май е -1. Според това, ако е -1, се пресмятат автоматично. 

1. Да, на мястото на многоточието трябва да е 5

2. В колбак уиндоу процедурата:

-декларацията "MSG hdc", следва да е "HDC hdc"

– дефолта не е DefWindowProg, a e DefWindowProc

3. Компилира се с

cl /EHsc /c firstwindow.cpp

4. Свързва се с 

link /subsystem:windows user32.lib gdi32.lib firstwindow.obj

5. Сорса се записва в текстов файл с примерно име firstwindow.cpp

6. Компилатора и линкера се викат от същата директория, в която е записан сорса

#include <windows.h>


LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg,
	WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT pect;
	switch (Msg)
	{
	case WM_DESTROY:  PostQuitMessage(0);   return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		GetClientRect(hWnd, &pect);
		DrawText(hdc, "hello", 5, &pect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		EndPaint(hWnd, &ps);
		return 0;
	default: break;
	}
	return DefWindowProc(hWnd, Msg, wParam, lParam);
}

//---------------------------------------------------------------------------

int WINAPI WinMain
(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
	WNDCLASSEX WndClsEx;

	static char szAppName[] = "FirstClass";
	MSG       Msg;

	WndClsEx.cbSize = sizeof(WndClsEx);
	WndClsEx.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
	WndClsEx.lpfnWndProc = WindowProc;
	WndClsEx.cbClsExtra = 0;
	WndClsEx.cbWndExtra = 0;
	WndClsEx.hInstance = hInstance;
	WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	WndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
	WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	WndClsEx.lpszMenuName = NULL;
	WndClsEx.lpszClassName = szAppName;
	WndClsEx.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);
	RegisterClassEx(&WndClsEx);

	CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
		szAppName, "My First Basic Win32 Application",
		WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, CW_USEDEFAULT,
		CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	while (GetMessage(&Msg, NULL, 0, 0))
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}


}
  
/*
3. Компилира се с

cl /EHsc /c firstwindow.cpp

4. Свързва се с 

link /subsystem:windows user32.lib gdi32.lib firstwindow.obj 
*/

 

Редактирано от Реджеп Иведик (преглед на промените)

преди 2 часа, ined написа:

BeginPaint(hWnd, &ps);

hdc = BeginPaint(hWnd, &ps);

Рисува се в пейнт месиджа, между бегин пейнт и енд пейнт. Обаче за да се рисува, трябва хендъл ту дивайс контекст. То е пойнтър, но трябва да се спази типа. Този пойнтър (хендъл) после се използва във функциите на гди32 за рисуване

преди 16 минути, martin stoqnov написа:

 

До някъде разбирам,но това компилиране с фърстуиндол.cpp и след него изобщо ?! :no-no:

Ама ти си карай с прагмите. Аз се шегувам с колегите.

Иначе за грешките не се шегувам.

Само бях забравил, че не сте присвоили стойност на хендъла за рисуване (hdc). Но съм го написал вярно, и ако го компилираш и го свържеш ще тръгне.

 

  • Автор
int WINAPI WinMain
(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

Тук ми дава грешка Declaration syntax error   Като сложа точка и запетая се не ми излиза грешка,но ме праща по надолу (където споменах в горния пост)

:helpwanted4:

Къде като сложиш точка и запетая ?

Ако ме няма, като отговориш.

Кодът така както съм го поправил е верен. Не знам каква среда за разработка ползваш, но като си сложиш прагмите (само тях съм изтрил, щото компилирам ръчно) и трябва да тръгне.

hInstance е член на WNDCLASSEX. Виж windows.h, който си инклуднал в началото на кода

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.