Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Backgroundcolor auf Buttonclick ändern-was fehlt?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.03.2007, 12:48 Uhr
me-S-on



Hallo. Ich bin auf dieses Forum gestossen, weil ich so etwas mit der WinApi rumspiele und , wie es sicher den meisten geht, habe ich ein kleines Problem mit der Nachrichtensteuerung:
Mir fällt ainfach keine Lösung hierzu ein, daher hoffe ich hier auf ein einige Tipps ( und ich denke, ich habe nur was banales übersehen.........)
Kurze beschreibung:
Ein Fenster, parent, mit zwei Knöpfen und einem Edit, children, ABER NUR
einer Nachrichtenfunktion, welche anhand des (HMENU) die Herkunft selektiert.
Der erste Knopf soll beim Klicken die Hintergundfarbe des Fensters ändern,
die BkColor der Caption auch.
Allerdings klappt es ( die Stelle ist im Q-C markiert) einfach nicht:
Bitte sehr, der Post des Q-C.

Code:


       /* parent and children- windows: on a click the bg.color shall be
   changed
*/
#define STRICT
#include<windows.h>
#include<time.h>
#include<stdlib.h>
//-- preprocesing---------------------------------------------------------------
LRESULT CALLBACK MessFunc(HWND,UINT,WPARAM,LPARAM);
const char szPaNa[] = "The parent window";

//-- global funcs and vars------------------------------------------------------
int WINAPI WinMain(HINSTANCE hiact,HINSTANCE hiprev,LPSTR cmdline,int showhow)
{
            
  MSG mess;
  WNDCLASS wcx;
  HWND hparentw;
  
  wcx.style = CS_HREDRAW | CS_VREDRAW;
  wcx.cbClsExtra = 0;
  wcx.cbWndExtra = 0;
  
  wcx.hInstance = hiact;
  wcx.lpfnWndProc = MessFunc;
  wcx.lpszClassName = szPaNa;
  wcx.lpszMenuName = NULL;
  
  wcx.hIcon = LoadIcon(NULL,IDI_EXCLAMATION);
  wcx.hCursor = LoadCursor(NULL,IDC_ARROW);
  wcx.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(120,140,200));
  
  if(!RegisterClass(&wcx))
  {
    MessageBox(NULL,"Registration failed", "Error occured",MB_OK);
    return 0;  
  }
  
  hparentw = CreateWindow(szPaNa,"Fucking parent window",
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,CW_USEDEFAULT,300,300,
                          NULL,
                          NULL,
                          hiact,
                          NULL
                          );
  ShowWindow(hparentw,showhow);
  UpdateWindow(hparentw);
  
  while(GetMessage(&mess,NULL,0,0)>0)
  {
    TranslateMessage(&mess);
    DispatchMessage(&mess);
  }  
  return mess.wParam;
}
LRESULT CALLBACK MessFunc(HWND mwinhan,UINT mcode, WPARAM wm_Wflags,LPARAM wm_Lflags)
{
  RECT clrect;
  GetClientRect(mwinhan,&clrect);
  
  switch(mcode)
  {
    case WM_SIZE:
    {
      
      //SendMessage(mwinhan,WM_CREATE,wm_Wflags);
    break;
    }
    case WM_CREATE:
    {
      HWND hchildb1 = CreateWindow("button","\"COLOR\"",
                                    WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON,
                                    clrect.right/4-35,clrect.bottom/3, 70, 30,
                                    mwinhan,
                                    (HMENU)2,
                                    (HINSTANCE)GetWindowLong(mwinhan,GWL_HINSTANCE),
                                    NULL
                                  );
      HWND hchildb2 = CreateWindow("button","\"B/W\"",
                                    WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON,
                                    clrect.right/2+35,clrect.bottom/3, 70, 30,
                                    mwinhan,
                                    (HMENU)3,
                                    (HINSTANCE)GetWindowLong(mwinhan,GWL_HINSTANCE),
                                    NULL
                                  );
      HWND hchilde1 = CreateWindow("edit","",
                                    WS_CHILD | WS_VISIBLE | ES_MULTILINE,
                                    
                                    clrect.right/4-35,clrect.bottom/2,(clrect.right/2+clrect.right/4)-6,100,
                                    mwinhan,
                                    (HMENU)4,
                                    (HINSTANCE)GetWindowLong(mwinhan,GWL_HINSTANCE),
                                    NULL
                                  );
    break;
    }
    case WM_COMMAND:
    {
      case WM_LBUTTONDOWN:
      {
        switch (LOWORD(wm_Wflags))
        {
          case 2:
          {
            int irgb[] = {rand()%255,rand()%255,rand()%255};            
            char  crgb[2];
            HDC  hdevcon;
            HBRUSH sbuff = (HBRUSH)SelectObject(hdevcon,CreateSolidBrush(RGB(irgb[0],irgb[1],irgb[2])));
            SendMessage(mwinhan,WM_PAINT,wm_Wflags,NULL);
            
                    
            DeleteObject(sbuff);                
          break;
          }
          case 3:
          {
           MessageBox(NULL,"FUCK","YOU 2",MB_OK);
          break;
          }      
        break;
        }
      break;
      }
    break;
    }
      
    case WM_PAINT:
    {
      const char szinfo[] = "Two button-children";
      HDC hdevcon;
      PAINTSTRUCT paintinfo;          
      hdevcon = BeginPaint(mwinhan,&paintinfo);
      SetBkMode(hdevcon,RGB(120,140,200));
      TextOut(hdevcon,clrect.right/4,clrect.bottom/8,szinfo,strlen(szinfo));
      InvalidateRect(mwinhan,&clrect,TRUE);
      EndPaint( mwinhan,&paintinfo);
      
    break;
    }
    
    
    case WM_DESTROY:
    {
      PostQuitMessage(0);
    break;  
    }
    
   return 0;
  }
  return DefWindowProc(mwinhan,mcode,wm_Wflags,wm_Lflags);
}




--
- Bonus vir semper tiro -

Dieser Post wurde am 13.03.2007 um 12:49 Uhr von me-S-on editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.03.2007, 15:54 Uhr
xXx
Devil


Dein Code ist Schwachsin. Du rufst Funktionen mit vollkommen falschen Parametern auf. Und du malst und erklärst direkt dein Fenster wieder für ungültig ... und das führt dazu das du alles wieder neu zeichnest.


C++:
#include <windows.h>
#include <ctime>

LRESULT CALLBACK MsgProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nShowCmd)
{
    WNDCLASS wc;
     wc.style            = 0;
    wc.cbClsExtra        = 0;
    wc.cbWndExtra        = 0;
    wc.hInstance        = hInstance;
    wc.lpfnWndProc        = MsgProc;
    wc.lpszClassName    = TEXT("my_window");
    wc.lpszMenuName        = NULL;
    wc.hIcon            = LoadIcon(NULL, MAKEINTRESOURCE(IDI_EXCLAMATION));
    wc.hCursor            = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground    = CreateSolidBrush(RGB(120, 140, 200));
  
    if (RegisterClass(&wc) == 0)
    {
        MessageBox(NULL, TEXT("Window-Registration failed"), NULL, MB_OK | MB_ICONERROR);
        return 0;  
    }
  
    HWND hWnd = CreateWindow(TEXT("my_window"), TEXT("my_app"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, NULL, NULL, hInstance, NULL);
  
    if (hWnd == NULL)
    {
        MessageBox(NULL, TEXT("Window-Creation failed"), NULL, MB_OK | MB_ICONERROR);
        return 0;
    }

    ShowWindow(hWnd, nShowCmd);
    UpdateWindow(hWnd);
      
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }  
  
    return static_cast<int>(msg.wParam);
}

LRESULT CALLBACK MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_PAINT:
        {
            PAINTSTRUCT ps;          
            HDC hDC = BeginPaint(hWnd, &ps);
            
            SetBkMode(hDC, TRANSPARENT);
            RECT rect_client;
            GetClientRect(hWnd, &rect_client);
            TextOut(hDC, rect_client.right / 4, rect_client.bottom / 8, TEXT("Wäre ich doch mal nicht zu dumm zum Programmieren."), 50);
            EndPaint(hWnd, &ps);
        } break;
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        } break;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}
Das ist so zumindest korrekt. Und schon korrigiert ... den Rest machst du nochmal neu und ordentlich. 6. Setzen.

Dieser Post wurde am 13.03.2007 um 15:55 Uhr von xXx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.03.2007, 22:39 Uhr
~me-S-on
Gast


Danke!
Ich weiss zwar nicht was ich von Dir halten soll, aber eines weiss ich:
Du weisst nicht, worum es mir geht.
Wo ist denn da die Hilfe???
Auf Buttonclick soll der den BG-color wechseln.
---> "Wärest Du nicht mal zu dumm zum lesen"!
-----
Sowas brauch ich noch gerade.
---dick prollen aber keinen Dunst vom Anliegen!
Der soll ein Parent zeichnen, das tut er, beim Create zwei Buttons, das geschieht auch,
daraufhin soll er beim click auf einen dieser Buttons das Parentwindow anhand dreimalig ausgeführtem rand()%255 in den jeweiligen rgbs ausfüllen!
Da prollst Du dick rum? Wegen n paar casts und nem Transparent, und die Hilfestellung mal eben auf das leichteste der Probleme vereinfacht?!?

WOW!
Kann ich auch.
-
Sach mal lieber, wie ich die SendMessage auf den Buttonclick senden muss, damit der in der WM_PAINT den hbrBackground umfärbt. Die Ungültigkeit ist nur , weil ich vermeiden möchte ( oder eher elegant ummodelieren möchte). die clientarera neuzuzeichnen, OHNE ERST EIN RECTANGLE MIT DEN CLIENT-KOORDINATEN zu initialisieren, daraufhin das RECTANGLE neu zu zeichnen.
Ich hatte nach diesem Pst bereits eine alternative, die auf den Klick hin die WM_PAINT verschickt, und wParam setzt.
In der WM_PAINT wird eine if-else hinzugefügt, in welcher im else zweig das ausgeführt wird, was bisher geschieht, aber im if (wParam != 0) , also, erst nachdem der Button gecheckt wurde, wird ja wParam gesetzt und in der SendMessage als erster Parameter von WM_PAINT anegeben, also : wenn wParam gesetzt ist, führt er aus, das zu tun , was du tipptest, vorher aber das Rectangle neu zeichnet, in dynamisch ermittelter RGB.
Ich teste deinen Vorschlag dennoch und baue auch das Rectangle mit ein.
Nur, ich muss zugeben, das ich schon mindestens 20 Varianten ausprobiert habe, davon einige mit eigenen Messages.
Wenn Deine dennoch funzt, dann stimmte es wohl doch, dass ich nur was banales übersehen habe, und das rechtfertigt doch keine 6 oder ?
In Zukunft bitte Antworten, die Kompetenz beinhalten, und nicht son Dünnschiss.
Dennoch danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.03.2007, 22:45 Uhr
xXx
Devil


Hmm ... also ... werde mal nicht so unverschämt. Das ist ein korrektes Fenstergrundgerüst. Dein Problem lässt sich aber ganz einfach lösen: in MsgProc ne static COLORREF die du dann bei WM_PAINT zum bemahlen des Hintergrundes nutz ... und bei dem Button-Klick setzt du deren Wert halt auf nen anderen und rufst InvalidateRect auf.
So. Und die im anderen Forum angesprochenen anderen Kritikpunkte kannst du leider nicht wegargumentieren (wenn du überhaupt schon dieses Geistige Niveau erreich hast).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.03.2007, 08:49 Uhr
~me-S-on
Gast



Zitat von xXx:
Hmm ... also ... werde mal nicht so unverschämt. Das ist ein korrektes Fenstergrundgerüst. Dein Problem lässt sich aber ganz einfach lösen: in MsgProc ne static COLORREF die du dann bei WM_PAINT zum bemahlen des Hintergrundes nutz ... und bei dem Button-Klick setzt du deren Wert halt auf nen anderen und rufst InvalidateRect auf.
So. Und die im anderen Forum angesprochenen anderen Kritikpunkte kannst du leider nicht wegargumentieren (wenn du überhaupt schon dieses Geistige Niveau erreich hast).

-
Wenn ich mir vorstelle, dass du Dein "geistiges Niveau" dadurch definierst, nun ein gecastetes return und gecastete Window captions zu benutzen, mir vorhälst, ich solle keine
globalen Vars nehmen, aber dann sagst, es ginge doch, mit ner static in der Nachrichtenschleife, ...
.auf was bildest du Dir denn was ein?
Unverschämt wurdest Du, nicht wundern, wenn es Dir missfällt, dass ich Deinen Umgangston nachfolgend gleichartig argumentierte.
Wegargumentieren wollte ich auch nichts, ausser, dass man sich mal an Kopf fassen solllte, bevor man sich etwas einbildet.
Ich programmieren seit 3 Jahren mit c rum und bin nicht einer, derer, die Du scheinbar fälschlicherweise erwartet hast, um deine " 6. setzen" Tour ernsthaft derart so rüberzubringen, dass etwaige andere Leser dann sagen:
"TOLL, Devil hat NIVEAU".
-
Warum nicht gleich so, anstatt selber unverschämt zu werden und sich dann wundern, warum das gleiche entgegenkommt?
Und: Dieses Fenstergerüst ist ok, sicher.
Aber nicht deine erste Antwort.
Leb damit, auch bei deinem "HOHOHOHOHO"en Niveau.
Man kann nicht alles haben.
Danke sehr.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.03.2007, 08:52 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


sorry,
aber wenn ihr euch nur beschimpft schließ ich das hier
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: