Zmiana miejsca wyrysowania wycinka pulpitu w oknie docelowym

0

Program w win32
Aktualnie program mi dobrze robi zrzut wycinka pulpitu do okienka.
Z tym że kopiuje wycinek pulpitu do lewego rogu okienka w

jaki sposób można zmieniać miejsce występowania tego wycinka w tym oknie

 
// rysowanie w oknie win32.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
//#include <windows.h>


LRESULT CALLBACK WndProc_okno1(HWND,UINT,WPARAM,LPARAM);
int fun_okno1(HWND hwnd[1],WNDCLASSEX wc[1],HINSTANCE hInst);
void rysowanie_txt(HWND hwnd);

const WORD ID_TIMER = 1;

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR lStart,INT nShow)
{

    //////////
    WNDCLASSEX wc;
    HWND Okno;
    fun_okno1(&Okno,&wc,hInst);
    //////////

    MSG msgs;
    MoveWindow(Okno, 0, 0, 900,900, false);
    ShowWindow(Okno,nShow);
    UpdateWindow(Okno);

    ///////////////////   start programu    ///////////////////////////////////////
    while(TRUE)
    {    
        MessageBox(0,_T("1111111"),_T("111111111"),MB_ICONSTOP);
        if(PeekMessage(&msgs,NULL,0,0,PM_REMOVE))
        {
            // test if this is a quit
            if(msgs.message == WM_QUIT) break;
            TranslateMessage( &msgs);
            DispatchMessage( &msgs);
        }  
        MessageBox(0,_T("22222222"),_T("22222222222"),MB_ICONSTOP);
        
    //////////
    rysowanie_txt(Okno);
    //////////

        MessageBox(0,_T("333333333"),_T("3333333"),MB_ICONSTOP);
    }    
    ///////////////////   koniec programu    ///////////////////////////////////////

  return msgs.wParam;
}
///////////////////////////////////////////////////

///////////////////////////////////////////////////
LRESULT CALLBACK WndProc_okno1(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{ 
    HDC hdcBitmapy, hdc;//zmienne na 2 konteksty
    PAINTSTRUCT ps;
     
    switch( msg )
    {
    case WM_CREATE:    
        break;
    case WM_COMMAND:
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;    
    case WM_PAINT: 
        {     
        hdc = BeginPaint( hWnd, &ps );
        EndPaint(hWnd,&ps);
        break;    
        }
    case WM_TIMER:
        break;
    default:
        return DefWindowProc( hWnd, msg, wParam, lParam );
    }
   
    return 0;
}// koniec obslugi komunikatow dla okna 1 : LRESULT CALLBACK WndProc
///////////////////////////////////////////////////

///////////////////////////////////////////////////
void rysowanie_txt(HWND hwnd)
{
    HWND he1=GetDesktopWindow();
    HDC hdcPulpitu = GetDC(he1);
    HDC kontekst = GetDC(hwnd); //Pobranie kontekstu
    
    if(!hdcPulpitu)
    {
       MessageBox(0,_T("!hdcBitmapy"),_T("!hdcBitmapy"),MB_ICONSTOP);
       goto done;
    }
    int szer_bmp,wys_bmp,od_szer,od_wys;
    szer_bmp=140;
    wys_bmp=60;
    od_szer=0;
    od_wys=100;

jeszczeraz2:
    if(!BitBlt(kontekst,0,0,szer_bmp,wys_bmp,hdcPulpitu,od_szer,od_wys,SRCCOPY))///
    {                                                                            ///    
     MessageBox(0,_T("!BitBlt"),_T("!BitBlt"),MB_ICONSTOP);                        ///    
     goto jeszczeraz2;                                                            ///
    }    

done:

    ReleaseDC(hwnd,kontekst);
    DeleteDC(hdcPulpitu);
}// koniec void rysowanie_txt
///////////////////////////////////////////////////

///////////////////////////////////////////////////
int fun_okno1(HWND hwnd[1],WNDCLASSEX wc[1],HINSTANCE hInst)
{
  wc[0].hInstance=hInst;
  wc[0].lpszClassName=_T("Klasa okna");
  wc[0].lpfnWndProc=WndProc_okno1;
  wc[0].style=CS_DBLCLKS;
  wc[0].cbSize=sizeof(WNDCLASSEX);
  wc[0].hIcon=LoadIcon(0,IDI_APPLICATION);
  wc[0].hIconSm=LoadIcon(0,IDI_APPLICATION);
  wc[0].hCursor=LoadCursor(0,IDC_ARROW);
  wc[0].lpszMenuName=0;
  wc[0].hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
  wc[0].cbWndExtra=0;
  wc[0].cbClsExtra=0;

  if(RegisterClassEx(&wc[0])==0) return 0;
  hwnd[0]=CreateWindowEx(0,_T("Klasa okna"),_T("Tytuł okna"),WS_OVERLAPPEDWINDOW,400,400,900,900,0,0,hInst,0);
}// koniec int fun_okno1
///////////////////////////////////////////////////

0

już wiem jak

0

Dlaczego ten program który według mnie jest dobrze napisany ciągle mi się do minuty prawidłowego działania zawiesza.

// rysowanie w oknie win32.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
//#include <windows.h>


LRESULT CALLBACK WndProc_okno1(HWND,UINT,WPARAM,LPARAM);
int fun_okno1(HWND hwnd[1],WNDCLASSEX wc[1],HINSTANCE hInst);
void rysowanie_txt(HWND hwnd);
void fun_przygot_czcionki(HWND hwnd,HDC kontekst[1],HFONT nowa_czcionka[1],HFONT stara_czcionka[1],COLORREF rgb1[1],COLORREF rgb2[1],int wys_czcionki1);
const WORD ID_TIMER = 1;


INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpsCmdLine, int nShowCmd)
{

    //////////
    WNDCLASSEX wc;
    HWND Okno;
    fun_okno1(&Okno,&wc,hInst);
    HDC kontekst=GetDC(Okno); //Pobranie kontekstu
    //////////

    MSG msgs;
    MoveWindow(Okno, 100, 300, 500,250, false);
    ShowWindow(Okno,nShowCmd);
    UpdateWindow(Okno);
    Sleep(1000);


    ///////////////////   start programu    ///////////////////////////////////////
    while(TRUE)
    {    
        //MessageBox(0,_T("1111111"),_T("111111111"),MB_ICONSTOP);
        if(PeekMessage(&msgs,NULL,0,0,PM_REMOVE))
        {
            // test if this is a quit
            if(msgs.message == WM_QUIT) break;
            TranslateMessage( &msgs);
            DispatchMessage( &msgs);
        }  
        //MessageBox(0,_T("22222222"),_T("22222222222"),MB_ICONSTOP);
        
    //////////
    rysowanie_txt(Okno);
    //////////

    //pisanie txt po obszarze roboczym okna
    HFONT hFont;//nowa czcionka
    HFONT font;//stara czcionka
    COLORREF Txtcolor=RGB(133,192,252);
    COLORREF Bkcolor=RGB(160,61,158);    
    int wys_czcionki=30;
    ///////////////
    fun_przygot_czcionki(Okno,&kontekst,&hFont,&font,&Txtcolor,&Bkcolor,wys_czcionki);//przygotowanie czcionki
    ///////////////
    Sleep(10);
    
    }
    ReleaseDC(Okno,kontekst);
    DeleteDC(kontekst);
    ///////////////////   koniec programu    ///////////////////////////////////////

  return msgs.wParam;
}
///////////////////////////////////////////////////

///////////////////////////////////////////////////
LRESULT CALLBACK WndProc_okno1(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{ 
    HDC hdcBitmapy, hdc;//zmienne na 2 konteksty
    PAINTSTRUCT ps;
     
    switch( msg )
    {
    case WM_CREATE:    
        break;
    case WM_COMMAND:
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;    
    case WM_PAINT: 
        {     
        hdc = BeginPaint( hWnd, &ps );
        EndPaint(hWnd,&ps);
        break;    
        }
    case WM_TIMER:
        break;
    default:
        return DefWindowProc( hWnd, msg, wParam, lParam );
    }
   
    return 0;
}// koniec obslugi komunikatow dla okna 1 : LRESULT CALLBACK WndProc
///////////////////////////////////////////////////

///////////////////////////////////////////////////
void rysowanie_txt(HWND hwnd)
{
    //Sleep(100);
    //HWND he1=GetDesktopWindow();//GetTopWindow or GetForegroundWindow GetActiveWindow
    HWND he1=GetForegroundWindow();
    //HWND he1=GetActiveWindow();
    HDC hdcPulpitu = GetDC(he1);
    HDC kontekst = GetDC(hwnd); //Pobranie kontekstu

jeszczeraz01:
    if(!kontekst)
    {
        MessageBox(0,_T("!kontekst"),_T("!kontekst"),MB_ICONSTOP);
        goto jeszczeraz01;
    }

jeszczeraz0:    
    if(!hdcPulpitu)
    {
       MessageBox(0,_T("!hdcPulpitu"),_T("!hdcPulpitu"),MB_ICONSTOP);
       goto jeszczeraz0;
    }
    int szer_bmp,wys_bmp,od_szer,od_wys;
    
    //TextOut(kontekst,200,200,_T("Witaj!"),6);

/*
    szer_bmp=72;wys_bmp=11;
    od_szer=409;od_wys=43;
    
jeszczeraz1:
    if(!BitBlt(kontekst,20,0,szer_bmp,wys_bmp,hdcPulpitu,od_szer,od_wys,SRCCOPY))///
    {                                                                            ///    
        MessageBox(0,_T("!BitBlt"),_T("!BitBlt"),MB_ICONSTOP);                        ///    
         goto jeszczeraz1;                                                            ///
    }    
*/
    szer_bmp=92;wys_bmp=11;
    od_szer=389-10;od_wys=43-30;
jeszczeraz1:
    if(!StretchBlt(kontekst,20,10,szer_bmp*3,wys_bmp*3,hdcPulpitu,od_szer,od_wys,szer_bmp,wys_bmp,SRCCOPY))///
    {                                                                            ///    
        MessageBox(0,_T("!StretchBlt"),_T("!StretchBlt"),MB_ICONSTOP);                        ///    
        goto jeszczeraz1;                                                            ///
    }

    szer_bmp=65;wys_bmp=60;
    od_szer=215-10;od_wys=199-30;
jeszczeraz2:
if(!StretchBlt(kontekst,20,45,szer_bmp*2,wys_bmp*2,hdcPulpitu,od_szer,od_wys,szer_bmp,wys_bmp,SRCCOPY))///
    {                                                                            ///    
        MessageBox(0,_T("!StretchBlt"),_T("!StretchBlt"),MB_ICONSTOP);                        ///    
        goto jeszczeraz2;                                                            ///
    }

    szer_bmp=155;wys_bmp=20;
    od_szer=166-10;od_wys=144-30;
jeszczeraz3:
    if(!StretchBlt(kontekst,150,45,szer_bmp*2,wys_bmp*2,hdcPulpitu,od_szer,od_wys,szer_bmp,wys_bmp,SRCCOPY))///
    {                                                                            ///    
        MessageBox(0,_T("!StretchBlt"),_T("!StretchBlt"),MB_ICONSTOP);                        ///    
        goto jeszczeraz3;                                                            ///
    }

    szer_bmp=50;wys_bmp=50;
    od_szer=332-10;od_wys=306-30;
jeszczeraz4:
    if(!StretchBlt(kontekst,150,85,szer_bmp*2,wys_bmp*2,hdcPulpitu,od_szer,od_wys,szer_bmp,wys_bmp,SRCCOPY))///
    {                                                                            ///    
        MessageBox(0,_T("!StretchBlt"),_T("!StretchBlt"),MB_ICONSTOP);                        ///    
        goto jeszczeraz4;                                                            ///
    }


    ReleaseDC(hwnd,kontekst);
    DeleteDC(kontekst);
    ReleaseDC(he1,hdcPulpitu);
    DeleteDC(hdcPulpitu);
}// koniec void rysowanie_txt
///////////////////////////////////////////////////

///////////////////////////////////////////////////
int fun_okno1(HWND hwnd[1],WNDCLASSEX wc[1],HINSTANCE hInst)
{
  wc->hInstance=hInst;
  (*wc).lpszClassName=_T("Klasa okna");
  wc[0].lpfnWndProc=WndProc_okno1;
  wc[0].style=CS_DBLCLKS;
  wc[0].cbSize=sizeof(WNDCLASSEX);
  wc[0].hIcon=LoadIcon(0,IDI_APPLICATION);
  wc[0].hIconSm=LoadIcon(0,IDI_APPLICATION);
  wc[0].hCursor=LoadCursor(0,IDC_ARROW);
  wc[0].lpszMenuName=0;
  wc[0].hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
  wc[0].cbWndExtra=0;
  wc[0].cbClsExtra=0;

  if(RegisterClassEx(&wc[0])==0) return 0;
  hwnd[0]=CreateWindowEx(0,_T("Klasa okna"),_T("Tytuł okna"),WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_SIZEBOX|WS_VSCROLL,400,400,900,900,0,0,hInst,0);
//WS_HSCROLL Okno posiada poziomy pasek przewijania.
//WS_SIZEBOX Okno posiada możliwość zmiany rozmiaru. To samo, co WS_THICKFRAME.
//WS_VSCROLL Okno posiada pionowy pasek przewijania.
}// koniec int fun_okno1
///////////////////////////////////////////////////

///////////////////////////////////////////////////
void fun_przygot_czcionki(HWND hwnd,HDC kontekst[1],HFONT nowa_czcionka[1],HFONT stara_czcionka[1],COLORREF rgb1[1],COLORREF rgb2[1],int wys_czcionki1)
{
    /*
    HFONT CreateFont
    int nHeight,              // logiczna wysokość czcionki
    int nWidth,               // logiczna średnia szerokość znaku
    int nEscapement,          // kąt "ucieczki" wiersza tekstu (??)
    int nOrientation,         // kąt nachylenia linii bazowej
    int fnWeight,             // stopień wytłuszczenia czcionki
    DWORD fdwItalic,          // flaga pochylenia czcionki (kursywy)
    DWORD fdwUnderline,       // flaga podkreślenia czcionki
    DWORD fdwStrikeOut,       // flaga przekreślenia czcionki 
    DWORD fdwCharSet,         // identyfikator systemu kodowania znaków
    DWORD fdwOutputPrecision, // dokładność na wyjściu
    DWORD fdwClipPrecision,   // dokładność przycinania
    DWORD fdwQuality,         // jakość na wyjściu
    DWORD fdwPitchAndFamily,  // skok i rodzina czcionki//kształt liter przypomina pismo odręczne (FF_SCRIPT),
    LPCTSTR lpszFace          // wskaźnik do nazwy kroju czcionki
    */


    TEXTMETRIC tm;//informacje o fizycznych właściwościach czcionki.
    LOGFONT logFont2;//zapisane informacje czcionki//structure defines the attributes of a font.
    memset(&logFont2, 0, sizeof(logFont2));
    
    nowa_czcionka[0]=CreateFont(48,0,0,0,FW_BOLD,0,0,0,DEFAULT_CHARSET,0,0,ANTIALIASED_QUALITY, VARIABLE_PITCH, TEXT("txt"));
    stara_czcionka[0]=(HFONT)SelectObject(kontekst[0],nowa_czcionka[0]);//zmiana czcionki na nowa_czcionka,zapisanie starej czcionki do font
    
    GetTextMetrics(kontekst[0],&tm);//pobieranie właściwości czcionki z SelectObject() do struktury &tm //Font Dimensions
    GetObject(nowa_czcionka[0],sizeof(logFont2), &logFont2);//pobranie informacji o czcionce do struktury LOGFONT 
    logFont2.lfHeight = wys_czcionki1;//modyfikacja istniejącej czcionki //logFont2.lfHeight=-MulDiv(piksele, GetDeviceCaps(kontekst, LOGPIXELSY), 72);
    nowa_czcionka[0]=CreateFontIndirect(&logFont2);
    
    SelectObject(kontekst[0], nowa_czcionka[0]);//aktualizacja zmienionej czcionki
    SetTextColor(kontekst[0],rgb1[0]); 
    SetBkColor(kontekst[0],rgb2[0]);
    //SetBkMode(kontekst,TRANSPARENT); // przezroczyste tlo dla textout
    SetTextAlign(kontekst[0],TA_LEFT|TA_TOP);
    
    //dopasuj okno do tekstu/////
    //SetWindowPos(hwnd, 0, 0, 0, rc.right, rc.bottom, SWP_NOZORDER | SWP_NOMOVE);
    //a wszystko poza tekstem ma być przezroczyste
    //SetLayeredWindowAttributes(hwnd, RGB(1,2,3), 0, LWA_COLORKEY);

/*
//////////////////////////////////////////////
//SPOSÓB nr 1:
wchar_t temp33[14];
int x = 3;
wsprintfW(temp33,_T("S.t.ring %d"),tm.tmHeight);
//wsprintfW(temp33,_T("S.t.ring %d"),logFont2.lfHeight);
tm.tmHeight=111;
TextOut(kontekst,95,95,temp33,wcslen(temp33));
//////////////////////////////////////////////
*/

}// koniec fun_przygot_do_rys_txt
///////////////////////////////////////////////////




 
0

HDC pobrane przez GetDC masz tylko zwolnić (ReleaseDC) a nie zniszczyć (DeleteDC).

0

po zablokowaniu tej funkcji program mi dobrze działa z tym że jeszcze nie wiem co jest nie tak w tej funkcji

 
fun_przygot_czcionki(Okno,&kontekst,&hFont,&font,&Txtcolor,&Bkcolor,wys_czcionki);
0

Jest w niej dużo nie tak. Najpierw robisz CreateFont a potem równoważne CreateFontIndirect na tej samej zmiennej - tracąc poprzedni uchwyt, a na dodatek całą tę funkcję odpalasz w realtime'owej pętli komunikatów.

Masz w programie mnóstwo wycieków.

CreateFont zrób tylko raz, po starcie programu (ja wolę CreateFontIndirect bo nie ma tysiąca zbędnych parametrów) i potem używaj tego fontu cały czas.

1 użytkowników online, w tym zalogowanych: 0, gości: 1