webForumDet fria alternativet

Skapa fönster!

C/C++

15 svar · 667 visningar · startad av Choice2

Medlem sedan sep. 200134 inlägg
Frågan#1

Riktig n00b på det här med c++ osv.
Skulle behöva lite hjälp att skapa ett fönster där man kan genom en funktion skriva ut text. Någon som känner sig lite sugen på att skriva ihop något och kommentera?

------------------
/*
include <geek.h>
http://warzone.big.du.se
*/

Medlem sedan nov. 200114 inlägg
#2

Hrm! Det krävs en del förkunskaper för att förstå sig på hur windows hantera sina fönster. Jag rekommenderar att du köper boken "Programming Windows 5th Edition av Petzold" som är en UTMÄRKT nybörjarbok. Jag använder den som läromedel för mina elever som läser just WIN32 API programmering.

Tips!
Starta ett nytt projekt i Visual Studio C++ 6.0 ( eller liknande ). Välj projektform: Win32 Application

Tryck på oki ( ge givetvis projektet ett namn ) och välj sedan alternativ tre i den gråa rutan som kommer upp.

Således alternativ: A Typical "Hello World" Application

Nu kommer du att få ett hyfsat bra kodexempel med KOMMENTARER som visar hur man öppnar ett fönster och skriver ut en text i den.

Lycka till!!!

Medlem sedan juni 200010 432 inlägg
#3

Det vimlar ju även av siter med källkoder till c / c++, speciellt populärt är det väl just med windows + fönster. Sök på google!
I övrigt skulle koden även till ett litet exempel bli lite väl lång att lägga upp här rakt upp och ned. Men särskilt "svårt" är det inte om man sätter sig in i winAPI:et, fast visst behövs grunderna i c/c++ först ;)

------------------
Ancilla, face mea laganum!

Medlem sedan sep. 200134 inlägg
#4

Humma.. ska omforumulera mig lite.
Jag har grunderna i C++, har ganska bra koll på det där med pekare och classer osv.
Har dock ingen koll alls på fönsterhantering osv. Tutorial? skola? osv?

------------------
/*
include <geek.h>
http://warzone.big.du.se
*/

Medlem sedan okt. 20013 217 inlägg
#5

Om du gör en MFC applikation får du en hel del gratis. Ett försnter från "scratch" (win32) är det en hel del bök med, dvs du måste implementera en egen message-pump för fönsteret etc. MFC sköter detta åt dig och man kan bara använda sig av fönstret.

// BeatBox

------------------
"Mörkrets gärningar, förekommer även på dagen"

Sixten Landby

Medlem sedan juni 200010 432 inlägg
#6

MFC = Blä!
Får väl klistra in ett litet fönster i värsta Ernst-stil då:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <math.h>

//Definitioner:

#define WINDOW_CLASS_NAME "WINCLASS1"

//Globala:

HWND main_window_handle = NULL; //Fönsterhandtag

//Deklarationer:

LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{

//meddelandehanterare

PAINTSTRUCT ps; //-> använt i WM_PAINT
HDC hdc; //-> handtaget till enhetsinnehållet

switch(msg)
{
case WM_CREATE: // när fönstret skapas
{
return 0;
} break;

  case WM_PAINT:   // när fönstret behöver ritas
  					  {
                   hdc = BeginPaint(hwnd,&ps);
                   EndPaint(hwnd,&ps);
                   return 0;
                   } break;

  case WM_DESTROY: // när fönstret avslutas
  					  {
                   PostQuitMessage(0); //-\> avslutar progget
                   return 0;
                   } break;

  default:break;
  }

  //bearbeta meddelanden som inte behandlats

  return(DefWindowProc(hwnd,msg,wparam,lparam));

  } // end WinProc

//********************** M A I N ***********************

int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASS winclass;
HWND hwnd;
MSG msg;

winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;

winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL,IDC_ARROW);
winclass.hbrBackground = GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;

//registrera fönsterklassen:

if(!RegisterClass(&winclass))
return 0;

//Skapa fönstret:

if(!(hwnd = CreateWindow(WINDOW_CLASS_NAME, //class
"Ett litet fönster!", //titel
WS_OVERLAPPEDWINDOW | WS_VISIBLE, //flagga
0,0, //x och y
320,200, //bredd och höjd
NULL, //handtag moder
NULL, //handtag till meny
hinstance,
NULL))) //skapa parametrar

	return 0;

//spara fönsterhandtaget globalt:

main_window_handle = hwnd;

//gå in i huvudhändelseloopen:

while(1)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT) break;
TranslateMessage(&msg); //översätt nycklar
DispatchMessage(&msg); //skicka meddelande
}

  // placera fortsättningen här

}

return(msg.wParam); //återgå till windows

}

Funkar klockrent i Borland 5.02
------------------
Ancilla, face mea laganum!

[Redigerat av PeW den 23 nov 2001]

Medlem sedan okt. 20013 217 inlägg
#7

Är det inte lite att gå över ån efter vatten då uppgiften va :

Skulle behöva lite hjälp att skapa ett fönster där man kan genom en funktion skriva ut text.

..och inte att lära sig win32 programmering ?

// BeatBox

------------------
"Mörkrets gärningar, förekommer även på dagen"

Sixten Landby

Medlem sedan juni 200010 432 inlägg
#8

Är det inte lite att gå över ån efter vatten då uppgiften va

Tja, det är inte första gången vi fattar saker olika, Beatbox ;)
Men nu har han lite alternativ iaf. Själv är jag så "skadad" att jag helst vill se kod gentemot att använda färdiga mallar.

------------------
Ancilla, face mea laganum!

[Redigerat av PeW den 23 nov 2001]

Medlem sedan mars 2001593 inlägg
#9

PeW vill inte vara pettig men i VB 6.0 ges felet:

Compiling...
fönster.cpp
C:\programmering\C++\windows\fönster.cpp(75) : error C2440: '=' : cannot convert from 'void *' to 'struct HBRUSH__ *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
Error executing cl.exe.

windows.exe - 1 error(s), 0 warning(s)

lol

------------------
Look Out!
The Tarntula Is Comming

[Redigerat av netfeed den 23 nov 2001]

Medlem sedan okt. 20013 217 inlägg
#10

Men nu har han lite alternativ iaf. Själv är jag så "skadad" att jag helst vill se kod gentemot att använda färdiga mallar.

Med ett system dryga 2 miljoner rader (utan kommentarer, tomma rader och automatgenererat) så försöker man välja enkla lösningar och utnyttja så mycker "färdigt" som möjligt. :-)

// BeatBox

------------------
"Mörkrets gärningar, förekommer även på dagen"

Sixten Landby

Medlem sedan juni 200010 432 inlägg
#11

PeW vill inte vara pettig men i VB 6.0 ges felet:....

Ajdå... :l

Koden funkar dock i Borland som sagt, men den är ursprungligen gjord i en äldre version av MS Visual så förmodligen är det nån simpel konvertering som ska till.
Precis som Ernst med sin kodspammning är denna kod hämtad ur en bok... men den illustrerar ganska bra (när man fått igång den) hur man lätt skapar ett grafiskt gränssnitt mot sina egna funktioner - utan att för den sakens skull ta till några hemska wizards... ;) eller färdiga mallar.

Beatbox ->
Jo det fattar jag ;) , men det var det väl inte frågan om här?

------------------
Ancilla, face mea laganum!

[Redigerat av PeW den 23 nov 2001]

Medlem sedan apr. 20003 971 inlägg
#12

"PeW vill inte vara pettig men i VB 6.0 ges felet"
Det är en viss skillnad på VB och VC.

Ändra
winclass.hbrBackground = GetStockObject(BLACK_BRUSH);
till
winclass.hbrBackground = GetStockBrush(BLACK_BRUSH);
eller
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);

------------------
- Swey
Med reservation för upprörda känslor.

Medlem sedan mars 2001593 inlägg
#13

testade att ändra båda och fick fram båda ggr:na:

Compiling...
fönster.cpp
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/fönster.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

fönster.exe - 2 error(s), 0 warning(s)

---
vad gör jag för fel jag vill se vad hänner :)

------------------
Look Out!
The Tarntula Is Comming

Medlem sedan juni 200010 432 inlägg
#14

I Borland funkar koden.
Men när jag testade den i VC98 fungerade det efter att ha rättat till felet (Swey´s tips (GetStockBrush()) )...

Inget hårresande, men en modell ... det blir ett litet fönster.

------------------
Ancilla, face mea laganum!

Medlem sedan nov. 200114 inlägg
#15

Problemet är att du har en FELAKTIG WINMAIN, eftersom den main du har gjort inte är godkänd. Testa med följande:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

Lycka till.

Om det inte lyckas kan du maila jimmy.palm@spray.se så skall vi se om jag inte kan hjälpa dig mer.

Medlem sedan sep. 200128 inlägg
#16

Det finns en bra tutorial på http://www.relisoft.com/win32/winnie.html
där lär man sig bygga fönster classer och komponenter utan att använda sig av mfc.

259 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)