CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 7 of 7

Threaded View

  1. #1
    Join Date
    Nov 2007
    Posts
    46

    Layered Window -- Strange behavior

    I'm trying to get a layered window to drag with the mouse, but it isn't even possible to click the window without it exhibiting behavior as if it were created with WS_EX_TRANSPARENT.

    Code:
    #include <iostream>
    
    #include <windows.h>
    
    static const int kWindowHeight = 256;
    static const int kWindowWidth = 256;
    
    bool PaintWindow(HWND hwnd) {
        HDC wdc = GetDC(hwnd);
        if(!wdc) {
            std::cout << std::endl << "error. getting dc";
        }
        HDC mdc = CreateCompatibleDC(wdc);
        if(!mdc) {
            std::cout << "error. creating dc";
        }
        HBITMAP mbm = CreateCompatibleBitmap(wdc, kWindowWidth, kWindowHeight);
        if(!mbm) {
            std::cout << std::endl << "error. creating bitmap";
        }
        HPEN pen = CreatePen(PS_SOLID, 12, RGB(255, 255, 255));
        if(!pen) {
            std::cout << std::endl << "error. creating pen";
        }
        if(!SelectObject(mdc, pen)) {
            std::cout << std::endl << "error. select pen";
        }
        if(!SelectObject(mdc, mbm)) {
            std::cout << std::endl << "error. select bitmap";
        }
        if(!MoveToEx(mdc, 0, 0, NULL)) {
            std::cout << std::endl << "error. move to";
        }
        if(!LineTo(mdc, kWindowWidth, kWindowHeight)) {
            std::cout << std::endl << "error. line to";
        }
        SIZE size;
        size.cx = kWindowWidth;
        size.cy = kWindowHeight;
        POINT point;
        point.x = 0;
        point.y = 0;
        BLENDFUNCTION blend;
        blend.BlendOp = AC_SRC_OVER;
        blend.BlendFlags = 0;
        blend.AlphaFormat = AC_SRC_ALPHA;
        blend.SourceConstantAlpha = 255;
        if(!UpdateLayeredWindow(hwnd, wdc, &point, &size, mdc, &point, 0, &blend, ULW_ALPHA)) {
            std::cout << std::endl << "error. update layered window";
        }
        if(!DeleteDC(mdc)) {
            std::cout << std::endl << "error. delete dc";
        }
        if(!DeleteObject(mbm)) {
            std::cout << std::endl << "error. delete bitmap";
        }
        if(!DeleteObject(pen)) {
            std::cout << std::endl << "error. delete pen";
        }
        if(!ReleaseDC(hwnd, wdc)) {
            std::cout << std::endl << "error. release dc";
        }
        return true;
    }
    
    LRESULT WINAPI WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
        switch(msg) {
            case WM_MOUSEMOVE:
                {
                    POINTS point = MAKEPOINTS(lParam);
                    std::cout << std::endl << "(" << point.x << ", " << point.y << ")";
                    return 0;
                }
            // case WM_NCHITTEST: // for dragging
                // return 2;
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
            case WM_QUIT:
                return 0;
        }
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    
    int main(int argc, char* argv[]) {
        WNDCLASSEX wnd;
        ZeroMemory(&wnd, sizeof(wnd));
        wnd.cbSize = sizeof(wnd);
        wnd.lpfnWndProc = WindowProc;
        wnd.hbrBackground = CreateSolidBrush(RGB(0, 255, 0));
        wnd.lpszClassName = L"MagicBlend";
        std::cout << "magic!";
        if(!RegisterClassEx(&wnd)) {
            std::cout << std::endl << "error. registering class";
            std::cin.get();
            return -1;
        }
        HWND hwnd = CreateWindowEx(WS_EX_LAYERED, wnd.lpszClassName, NULL, WS_OVERLAPPEDWINDOW, 0, 0, kWindowWidth, kWindowHeight, NULL, NULL, wnd.hInstance, NULL);
        if(!hwnd) {
            std::cout << std::endl << "error. creating window";
            std::cin.get();
            return -2;
        }
        MSG msg;
        ShowWindow(hwnd, SW_SHOW);
        PaintWindow(hwnd);
        while(GetMessage(&msg, 0, 0, 0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return 0;
    }
    Any help would be appreciated.
    Last edited by TheDominis; June 26th, 2010 at 01:11 PM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured