Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z wlasną funkcja rysującą w WinApi

Ostatnio zmodyfikowano 2015-04-19 14:35
Autor Wiadomość
Mahir
Temat założony przez niniejszego użytkownika
Problem z wlasną funkcja rysującą w WinApi
» 2015-03-24 14:47:17
Witam

Napisalem w WinApi wlasna funkcje do wyświetlania bitmap. Lecz gdy chcę wyświetlić tą samą bitmape to niestety ona się nie wyświetla.

C/C++
#include <string>
#include <windows.h>

using namespace std;

HBITMAP CreateBitmapMask( HBITMAP hbmColour, COLORREF crTransparent )
{
    HDC hdcMem, hdcMem2;
    HBITMAP hbmMask, hbmOld, hbmOld2;
    BITMAP bm;
   
    GetObject( hbmColour, sizeof( BITMAP ), & bm );
    hbmMask = CreateBitmap( bm.bmWidth, bm.bmHeight, 1, 1, NULL );
   
    hdcMem = CreateCompatibleDC( NULL );
    hdcMem2 = CreateCompatibleDC( NULL );
   
    hbmOld =( HBITMAP ) SelectObject( hdcMem, hbmColour );
    hbmOld2 =( HBITMAP ) SelectObject( hdcMem2, hbmMask );
   
    SetBkColor( hdcMem, crTransparent );
   
    BitBlt( hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY );
    BitBlt( hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem2, 0, 0, SRCINVERT );
   
    SelectObject( hdcMem, hbmOld );
    SelectObject( hdcMem2, hbmOld2 );
    DeleteDC( hdcMem );
    DeleteDC( hdcMem2 );
   
    return hbmMask;
}

void rysuj( HBITMAP hbmObraz, HWND hwnd, int X, int Y )
{
    HBITMAP hbmOld, hbmMaska;
    hbmMaska = CreateBitmapMask( hbmObraz, RGB( 0, 255, 0 ) );
    HDC hdc = GetDC( hwnd ), hdcNowy = CreateCompatibleDC( hdc );
    BITMAP bmInfo;
   
    GetObject( hbmObraz, sizeof( bmInfo ), & bmInfo );
    hbmOld =( HBITMAP ) SelectObject( hdcNowy, hbmMaska );
   
    BitBlt( hdc, X, Y, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCAND );
    SelectObject( hdcNowy, hbmObraz );
    BitBlt( hdc, X, Y, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCPAINT );
   
    ReleaseDC( hwnd, hdc );
    SelectObject( hdcNowy, hbmOld );
    DeleteDC( hdcNowy );
    DeleteObject( hbmMaska );
    DeleteObject( hbmObraz );
}

Nie wiem co robie źle i czy tylko ja tak mam, prosze o pomoc.
P-129034
Mahir
Temat założony przez niniejszego użytkownika
» 2015-03-25 17:38:06
Co, to ja tylko mam ten problem??
Czemu nick nie chce pomoc?
P-129154
pekfos
» 2015-03-25 22:07:20
Gdzie wywołujesz tę funkcję?
P-129178
Mahir
Temat założony przez niniejszego użytkownika
» 2015-03-26 16:19:25
między ShowWindow(...) a while(GetMessage(...)) w WinMain
P-129205
pekfos
» 2015-03-26 17:04:33
Zapomniałeś napisać, że cały kod skopiowałeś z kursu. Wypadało by przynajmniej doczytać lekcję do końca.
» Kurs WinAPI, C++ » PodstawyBitmapy lekcja
"Odświeżanie zawartości okienka".
P-129211
Mahir
Temat założony przez niniejszego użytkownika
» 2015-03-26 17:26:45
Najgorsze jest to ze nadal nie dziala :c
P-129214
Brunon3
» 2015-03-26 17:32:24
Najgorsze jest to ze nadal nie dziala :c

A pokażesz co zrobiłeś że nadal nie działa..?

-BD.
P-129217
Mahir
Temat założony przez niniejszego użytkownika
» 2015-03-26 17:45:48
zrobilem to tak:
C/C++
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
#define UNICODE
#endif

#include <tchar.h>
#include <windows.h>
#include "windows++.h" // moja biblioteka

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

TCHAR szClassName[] = _T( "CodeBlocksWindowsApp" );

HBITMAP test;
HWND hwnd;

int WINAPI WinMain( HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow )
{
    MSG messages;
    WNDCLASSEX wincl;
   
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof( WNDCLASSEX );
   
    wincl.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    wincl.hCursor = LoadCursor( NULL, IDC_ARROW );
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
   
    wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND;
   
   
    if( !RegisterClassEx( & wincl ) )
         return 0;
   
   
    hwnd = CreateWindowEx(
    0,
    szClassName,
    _T( "Code::Blocks Template Windows App" ),
    WS_OVERLAPPEDWINDOW, /* default window */
    CW_USEDEFAULT, /* Windows decides the position */
    CW_USEDEFAULT, /* where the window ends up on the screen */
    544, /* The programs width */
    375, /* and height in pixels */
    HWND_DESKTOP, /* The window is a child-window to desktop */
    NULL, /* No menu */
    hThisInstance, /* Program Instance handler */
    NULL /* No Window Creation data */
    );
   
    ShowWindow( hwnd, nCmdShow );
   
    test =( HBITMAP ) LoadImage( NULL, "kompas.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
   
    while( GetMessage( & messages, NULL, 0, 0 ) )
    {
        TranslateMessage( & messages );
       
        DispatchMessage( & messages );
    }
   
    return messages.wParam;
}

LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
    case WM_PAINT:
        {
            PAINTSTRUCT ps; // deklaracja struktury
            HDC hdc = BeginPaint( hwnd, & ps );
           
            rysuj( test, hwnd, 50, 50 );
            rysuj( test, hwnd, 150, 150 );
           
            EndPaint( hwnd, & ps ); // zwalniamy hdc
        }
        break;
       
        default:
        return DefWindowProc( hwnd, message, wParam, lParam );
    }
   
    return 0;
}
i nadal nie dziala
P-129219
« 1 » 2
  Strona 1 z 2 Następna strona