p01nter



  • Hallo,
    unten findet ihr ein code, der ein Windows mit einem Skin erzeugen soll.
    Leider funktioniert er nicht. Der Compiler spuckt keine Fehler aus. Debuggen brachte auch nicht viel (mag drann liegen, dass ich es zuvor noch nie gemacht habe). Vielleicht könnt ihr mir helfen. Ich wäre euch sehr verbunden.
    Ach ja, ich nutze den CodeBlock C.

    region.cpp:

    // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    //
    // WINDOWS SKINNING TUTORIAL - by Vander Nunes - virtware.net
    // This is the source-code that shows what is discussed in the tutorial.
    // The code is simplified for the sake of clarity, but all the needed
    // features for handling skinned windows is present. Please read
    // the article for more information.
    //
    // region.cpp
    // 28/02/2002 : initial release.
    //
    // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    
    #include "skinregion.h"
    #include "resource.h"
    
    // ------------------------------------------------------------------------
    // The application entry point
    // ------------------------------------------------------------------------
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, \
                       LPSTR lpCmdLine, int nCmdShow)
    {
      // -------------------------------------------------
      // prepare the skin for posterior blitting
      // -------------------------------------------------
    
      // load the skin bitmap from resource
      hSkinBmp = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SKIN));
      if (!hSkinBmp) return -1;
    
      // create a device context for the skin
      dcSkin = CreateCompatibleDC(0);
    
      // select the skin bitmap
      hOldBmp = (HBITMAP)SelectObject(dcSkin, hSkinBmp);
    
      // -------------------------------------------------
      // create the application window.
      // -------------------------------------------------
    
      if ( !MakeWindow(320, 240) ) return -1;
    
      // show window
      ShowWindow(hWnd, SW_SHOW);
    
      // -------------------------------------------------
      // now just keep the application going...
      // -------------------------------------------------
    
      MSG mMsg;
    
      while (1)
      {
    
        if(PeekMessage(&mMsg, 0, 0, 0, PM_REMOVE))
        {
          // -------------------------------------------------
          // the quit message
          // can arrive at any time from our window procedure.
          // -------------------------------------------------
          if(mMsg.message == WM_QUIT)
          { break; }
    
          // -------------------------------------------------
          // the common stuff, just translate&dispatch.
          // -------------------------------------------------
          TranslateMessage(&mMsg);
          DispatchMessage(&mMsg);
        }
    
      }
    
      // -------------------------------------------------
      // free allocated resources
      // -------------------------------------------------
    
      SelectObject(dcSkin, hOldBmp);
      DeleteObject(hSkinBmp);
      DeleteDC(dcSkin);
      DestroyWindow(hWnd);
    
      // tchau!
      return 0;
    }
    
    // ------------------------------------------------------------------------
    // Skin the window
    // ------------------------------------------------------------------------
    void SkinMe(HDC dc)
    {
      // --------------------------------------------------
      // this is just as easy as blitting the skin
      // --------------------------------------------------
      BitBlt(dc, 0,0,320,240, dcSkin, 0,0, SRCCOPY);
    }
    
    // ------------------------------------------------------------------------
    // Build a basic region and set it to the window.
    // ------------------------------------------------------------------------
    void RegionMe()
    {
      // --------------------------------------------------
      // create an elliptical region.
      // we use a negative starting y coordinate to make
      // the ellipse cover a bit more of the caption.
      // --------------------------------------------------
      HRGN hRegion1 = CreateEllipticRgn(20,-20,190,150);
      OffsetRgn(hRegion1, GetSystemMetrics(SM_CXBORDER)*4, GetSystemMetrics(SM_CYCAPTION));
    
      // --------------------------------------------------
      // create one more elliptical region in other place.
      // --------------------------------------------------
      HRGN hRegion2 = CreateEllipticRgn(140,100,300,240);
      OffsetRgn(hRegion2, GetSystemMetrics(SM_CXBORDER)*4, GetSystemMetrics(SM_CYCAPTION));
    
      // --------------------------------------------------
      // combine the two regions to build a new region
      // that will be the sum of the two.
      // the resulting region will be stored in region1,
      // like if we were making something like:
      // hRegion1 = hRegion1 + hRegion2.
      // --------------------------------------------------
      CombineRgn(hRegion1, hRegion1, hRegion2, RGN_OR);
    
      // --------------------------------------------------
      // assign the region to the window
      // --------------------------------------------------
      SetWindowRgn(hWnd, hRegion1, true);
    
      // --------------------------------------------------
      // delete the region objects
      // --------------------------------------------------
      DeleteObject(hRegion1);
      DeleteObject(hRegion2);
    
      // --------------------------------------------------
      // change window style (get rid of the caption bar)
      // --------------------------------------------------
      DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
      dwStyle &= ~(WS_CAPTION|WS_SIZEBOX);
      SetWindowLong(hWnd, GWL_STYLE, dwStyle);
    
      // --------------------------------------------------
      // force a window repainting
      // --------------------------------------------------
      InvalidateRect(hWnd, NULL, TRUE);
      SetWindowPos(hWnd, NULL, 0,0,320,242, SWP_NOMOVE|SWP_NOZORDER);
    
      // --------------------------------------------------
      // flag just to make sure our app knows about it.
      // --------------------------------------------------
      bRegioned = true;
    }
    
    // ------------------------------------------------------------------------
    // Remove the region from the window
    // ------------------------------------------------------------------------
    void UnRegionMe()
    {
      // --------------------------------------------------
      // unassign the region
      // --------------------------------------------------
      SetWindowRgn(hWnd, NULL, true);
    
      // --------------------------------------------------
      // change window style (show caption bar again)
      // --------------------------------------------------
      DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
      dwStyle |= WS_CAPTION|WS_SIZEBOX;
      SetWindowLong(hWnd, GWL_STYLE, dwStyle);
    
      // --------------------------------------------------
      // force a window repainting
      // --------------------------------------------------
      InvalidateRect(hWnd, NULL, TRUE);
      SetWindowPos(hWnd, NULL, 0,0,320,240, SWP_NOMOVE|SWP_NOZORDER);
    
      // --------------------------------------------------
      // flag just to make sure our app knows about it.
      // --------------------------------------------------
      bRegioned = false;
    }
    
    // ------------------------------------------------------------------------
    // A Basic, still smart window creation function.
    // ------------------------------------------------------------------------
    bool MakeWindow(int iWidth, int iHeight)
    {
      // our window class
      WNDCLASS wndWc;
    
      // ---------------------------------------------------------
      // fill window class members
      // ---------------------------------------------------------
      wndWc.style = CS_OWNDC;
      wndWc.lpfnWndProc = (WNDPROC) WndProc;
      wndWc.cbClsExtra = 0;
      wndWc.cbWndExtra = 0;
      wndWc.hInstance = GetModuleHandle(NULL);
      wndWc.hIcon = NULL;
      wndWc.hCursor = LoadCursor(0, IDC_ARROW);
      wndWc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
      wndWc.lpszMenuName = NULL;
      wndWc.lpszClassName = "w32skin";
    
      // register class
      if (!RegisterClass(&wndWc)) return false;
      // ---------------------------------------------------------
    
      // get actual screen resolution
      int iSw = (WORD)GetSystemMetrics(SM_CXSCREEN);       // width
      int iSh = (WORD)GetSystemMetrics(SM_CYSCREEN);       // height
    
      // make a rectangle on the center of the screen
      RECT rc = { (iSw - iWidth)/2, (iSh - iHeight)/2, iWidth, iHeight };
    
      // create the window. the spaces on the window title
      // are just to make sure this will be visible when the region
      // is active. just run the app and you'll understand. =)
      hWnd = CreateWindow("w32skin", "       w32skin",
                          WS_OVERLAPPEDWINDOW,
                          rc.left,rc.top, iWidth,iHeight,
                          NULL, NULL, GetModuleHandle(NULL), NULL);
    
      // return result
      return (hWnd?true:false);
    }
    
    // ------------------------------------------------------------------------
    // Our application window procedure.
    // Here we'll process the messages sent to our application window.
    // ------------------------------------------------------------------------
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
    {
    
      switch(uMessage)
      {
    
        case WM_KEYDOWN:
        {
          // ---------------------------------------------------------
          // pressing ESC will finish the app.
          // ---------------------------------------------------------
          switch (wParam)
          {
            case VK_ESCAPE:
              PostQuitMessage(0);
              break;
    
            case VK_SPACE:
              if (!bRegioned)
                RegionMe();
              else
                UnRegionMe();
          }
          break;
        }
    
        case WM_PAINT:
        {
          // -------------------------------------------------
          // tell user to press SPACE to toggle region.
          // -------------------------------------------------
    
          PAINTSTRUCT ps;
          BeginPaint(hWnd,&ps);
    
          if (bRegioned) SkinMe(ps.hdc);
          SetBkMode(ps.hdc,TRANSPARENT);
          SetTextColor(ps.hdc,RGB(255,0,0));
          TextOut(ps.hdc, 115,90, "Press SPACE", 11);
    
          EndPaint(hWnd,&ps);
    
          break;
        }
    
        case WM_LBUTTONDOWN:
        {
          // ---------------------------------------------------------
          // this is a common trick for easy dragging of the window.
          // this message fools windows telling that the user is
          // actually dragging the application caption bar.
          // ---------------------------------------------------------
          if (bRegioned) SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION,NULL);
          break;
        }
    
        case WM_DESTROY:
        {
          // ---------------------------------------------------------
          // closing the window will finish the app.
          // (the quit message will be read by our main loop)
          // ---------------------------------------------------------
          PostQuitMessage(0);
          break;
        }
    
      }
    
      // ---------------------------------------------------------
      // call the default window procedure to keep things going.
      // ---------------------------------------------------------
      return DefWindowProc(hWnd,uMessage,wParam,lParam);
    }
    

    recource.h:

    //{{NO_DEPENDENCIES}}
    // Microsoft Developer Studio generated include file.
    // Used by skinregion.rc
    //
    #define IDB_BITMAP1                     101
    #define IDB_SKIN                        101
    
    // Next default values for new objects
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        102
    #define _APS_NEXT_COMMAND_VALUE         40001
    #define _APS_NEXT_CONTROL_VALUE         1000
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif
    

    skinregion.h:

    // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    //
    // WINDOWS SKINNING TUTORIAL - by Vander Nunes - virtware.net
    // This is the source-code that shows what is discussed in the tutorial.
    // The code is simplified for the sake of clarity, but all the needed
    // features for handling skinned windows is present. Please read
    // the article for more information.
    //
    // region.h
    // 28/02/2002 : initial release.
    //
    // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    
    #ifndef _REGION_H_
    
      #define _REGION_H_
      #include <windows.h>
    
      // app window handle
      HWND hWnd=NULL;
    
      // region toggle
      bool bRegioned;
    
      // skin device context
      HDC     dcSkin;
    
      // skin bitmap and old device context bitmap
      HBITMAP hSkinBmp, hOldBmp;
    
      // app window procedure
      LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam);
    
      // window creation helper
      bool MakeWindow(int iWidth, int iHeight);
    
    #endif
    


  • Ich habe gerade gemerkt, dass ich mein Nutzernamen und den Titel vertauscht habe. Tut mir leid.



  • Wieso soll das nicht funktionieren, ich habe das mal mit Visual C++ übersetzt und es läuft. Das einzige was mir auffällt ist, daß das Region-Handle gelöscht wird, nachdem die Region mit SetWindowRgn für das Fenster gesetzt ist, was man laut MSDN nicht tun soll.


Log in to reply