달력

52025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'프로그래밍/API 프로그래밍'에 해당되는 글 24건

  1. 2008.12.16 bitmap 출력하기
  2. 2008.11.29 공용컨트롤 tree 1
  3. 2008.11.29 공용 컨트롤 슬라이드 1
  4. 2008.11.29 system화일 열거하기
  5. 2008.11.29 spy++기능 구현하기..
  6. 2008.11.05 Timer 응용
  7. 2008.11.05 settimer생성 killtimer파괴
  8. 2008.11.02 키보드 이벤트
  9. 2008.11.02 시스템 키보드 처리
  10. 2008.11.02 MOUSE 위치 이벤트
비트맵에 관한 기본적인 소스 모아서 올립니다.
그중에 응용해서 사용한 소스는 밑에 부분입니다.
궁금하신거 있음 댓글 달아 주세요..ㅎ
// 디지털 시계
#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    //-----------------------------------------------
    static HBITMAP        hBitmap;
    static SYSTEMTIME    st;
    static RECT            rc = { 0, 0, 108, 27 };
    //----------------------------------------------

    switch( msg )
    {
    case WM_NCRBUTTONUP:
        {
            HINSTANCE    hInst = GetModuleHandle(0);
            HMENU        h1      = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1));

            HMENU        h2    = GetSubMenu(h1, 0);
            POINT        pt;
            GetCursorPos(&pt);        // 스크린 좌표 얻기..

            // 팝업 메뉴..
            int cmd    = TrackPopupMenu(h2, TPM_LEFTBUTTON | TPM_RETURNCMD,
                            pt.x, pt.y, 0, hwnd, 0);
            // 메뉴 처리..
            if( cmd == IDM_FILE_EXIT)
                SendMessage(hwnd, WM_CLOSE, 0, 0);
            DestroyMenu(h1);
        }
        return 0;
    case WM_TIMER:
        if( wParam == 1)
        {
            GetLocalTime(&st);
            InvalidateRect(hwnd, &rc, FALSE);
        }
        return 0;

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC    hdc        = BeginPaint(hwnd, &ps);

            HDC memDC    = CreateCompatibleDC(hdc);
            HBITMAP old = (HBITMAP)SelectObject(memDC, hBitmap);
            SetViewportOrgEx(hdc, 2, 2, 0);
            //
            //
            //---------------------------------------------
            int t[8] = { st.wHour / 10, st.wHour % 10, 10,
                        st.wMinute / 10, st.wMinute % 10, 10,
                        st.wSecond / 10, st.wSecond    %10 };

            for( int i=0; i< 8; ++i)        // 0
                BitBlt(hdc, i*13, 0, 13, 23, // 0, 0, 13, 23
                            memDC,  t[i]*13, 0,  SRCCOPY);
            //-----------------------------------------------
                                            // t[0]*13,0
            SelectObject(memDC, old);
            DeleteDC(memDC);

            EndPaint(hwnd, &ps);
        }
        return 0;
    case WM_DESTROY:
        //-------------------------
        KillTimer(hwnd, 1);
        DeleteObject(hBitmap);
        //-------------------------
        PostQuitMessage(0);
        return 0;

    case WM_CREATE:
        {
        // LoadBitmap : rc로 접근...
        // LoadImage  : 디렉토리/파일 명으로 접근..
        hBitmap = (HBITMAP)LoadImage(0, ".\\resource\\Digit.bmp", IMAGE_BITMAP, 0, 0,
                                    LR_LOADFROMFILE);
//         HINSTANCE hInst = ((LPCREATESTRUCT)lParam)->hInstance;
//        hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));

        SetTimer(hwnd, 1, 1000, 0);
        SendMessage(hwnd, WM_TIMER, 1,0);

        // 윈도우 스타일 변경..
        // Popup 만 주고 모든 속성 제거..
        SetWindowLong(hwnd, GWL_STYLE, (LONG)WS_POPUP);
        SetWindowPos(hwnd, 0, 0, 0, 108, 27,
            SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME);
        }
        return 0;
    case WM_NCHITTEST:
        return HTCAPTION;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nShowCmd)
{
    // 1. 윈도우 클래스 만들기
    WNDCLASS wc;
    wc.cbWndExtra            = 0;
    wc.cbClsExtra            = 0;
    wc.hbrBackground        = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor                = LoadCursor(0, IDC_ARROW);
    wc.hIcon                = LoadIcon(0, IDI_APPLICATION);
    wc.hInstance            = hInstance;
    wc.lpfnWndProc            = WndProc;            // DefWindowProc;
    wc.lpszClassName        = "First";
    wc.lpszMenuName            = 0;
    wc.style                = 0;

    // 2. 등록(레지스트리에)
    RegisterClass(&wc);

    // 3. 윈도우 창 만들기
    HWND hwnd = CreateWindowEx( 0,                    // WS_EX_TOPMOST
                 "first",                // 클래스 명
                 "Hello",                // 캡션바 내용
                 WS_OVERLAPPEDWINDOW,
                 CW_USEDEFAULT , 0, CW_USEDEFAULT, 0,    // 초기 위치
                 0, 0,            // 부모 윈도우 핸들, 메뉴 핸들
                 hInstance,        // WinMain의 1번째 파라미터 (exe 주소)
                 0);            // 생성 인자



    // 4. 윈도우 보여주기
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);
   

    // 5. Message
    MSG msg;
    while( GetMessage( &msg, 0, 0, 0 ) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}


// Bitmap _오목...클릭시에 검은 돌...
//이걸 이용해서 오목 만들수 있겠죠?
#define _WIN32_WINNT    0x500
#define WINVER            0x500
#include <windows.h>
#pragma comment( lib, "msimg32.lib")        // TransparentBlt는 msimg32.lib안에 존재..
//-----------------------------------------------------------
static HBITMAP    hPen, hWhite, hBlack;

enum { EMPTY = 1, BLACK = 2, WHITE = 3 };
char board[19][19] = { EMPTY };
//-----------------------------------------------------------
void DrawStone( HDC hdc, int x, int y, char stone)
{
    HDC memDC        = CreateCompatibleDC(hdc);
    HBITMAP old;
    if( stone == BLACK)   
        old = (HBITMAP)SelectObject(memDC, hBlack);
    else
        old = (HBITMAP)SelectObject(memDC, hWhite);
//    BitBlt(hdc, x, y, 29, 29, memDC, 0, 0, SRCCOPY);
    TransparentBlt(hdc, x, y, 29, 29, memDC, 0, 0, 29, 29, RGB(255, 0, 0));
    SelectObject(memDC, old);

    DeleteDC(memDC);
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch( msg )
    {
        case WM_LBUTTONDOWN:
        {
            // 1. 검은돌 차례인가?
            // 2. 현재 좌표에 돌이 없는가? ( board 배열 확인 )
            // 3. 돌을 그린다...
            POINTS  pt = MAKEPOINTS(lParam);
            pt.x    = (( pt.x) / 30 ) * 30 + 5;
            pt.y    = (( pt.y)/ 30 ) * 30 + 5;

            HDC hdc = GetDC(hwnd);
            // 돌을 화면상에 그리는 함수 구현
            DrawStone(hdc, pt.x, pt.y, BLACK);
            ReleaseDC(hwnd, hdc);

            // 4. board 배열 수정
            // 5. 이겼는가?
            // 6. 흰돌차례가 되도록 변수 수정..
        }
        return 0;

    case WM_CREATE:
        {
        hPen = (HBITMAP)LoadImage(0, "Pan.bmp", IMAGE_BITMAP, 0, 0,
                                        LR_LOADFROMFILE);
        hBlack = (HBITMAP)LoadImage(0, "black.bmp", IMAGE_BITMAP, 0, 0,
                                        LR_LOADFROMFILE);
        hWhite = (HBITMAP)LoadImage(0, "white.bmp", IMAGE_BITMAP, 0, 0,
                                        LR_LOADFROMFILE);
        //--------------------------------------------------------------
        RECT r = { 0, 0, 610, 610 };

        // 원하는 클라이언트의 크기로 설정...
        AdjustWindowRect(&r,
                    GetWindowLong(hwnd, GWL_STYLE), FALSE);

        int cx = r.right    - r.left    ;
        int cy = r.bottom    - r.top        ;
        MoveWindow(hwnd, 0, 0, cx, cy, TRUE);
        }
        //----------------------------------------------------
        return 0;

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc        = BeginPaint(hwnd, &ps);
            HDC memDC    = CreateCompatibleDC(hdc);
            HBITMAP old = (HBITMAP)SelectObject(memDC, hPen);

            BitBlt(hdc, 0, 0, 610, 610, memDC, 0, 0, SRCCOPY);

            SelectObject(memDC, old);
            DeleteDC(memDC);

            EndPaint(hwnd , &ps);
        }
        return 0;

    case WM_RBUTTONDOWN:
        return 0;
    case WM_DESTROY:
        //---------------------------------
        DeleteObject(hPen);
        DeleteObject(hBlack);
        //---------------------------------
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nShowCmd)
{
    // 1. 윈도우 클래스 만들기
    WNDCLASS wc;
    wc.cbWndExtra            = 0;
    wc.cbClsExtra            = 0;
    wc.hbrBackground        = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor                = LoadCursor(0, IDC_ARROW);
    wc.hIcon                = LoadIcon(0, IDI_APPLICATION);
    wc.hInstance            = hInstance;
    wc.lpfnWndProc            = WndProc;            // DefWindowProc;
    wc.lpszClassName        = "First";
    wc.lpszMenuName            = 0;
    wc.style                = 0;

    // 2. 등록(레지스트리에)
    RegisterClass(&wc);

    // 3. 윈도우 창 만들기
    HWND hwnd = CreateWindowEx( 0,                    // WS_EX_TOPMOST
                 "first",                // 클래스 명
                 "Hello",                // 캡션바 내용
                 WS_OVERLAPPEDWINDOW,
                 0 , 0, 100, 100,    // 초기 위치
                 0, 0,            // 부모 윈도우 핸들, 메뉴 핸들
                 hInstance,        // WinMain의 1번째 파라미터 (exe 주소)
                 0);            // 생성 인자



    // 4. 윈도우 보여주기
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);
   

    // 5. Message
    MSG msg;
    while( GetMessage( &msg, 0, 0, 0 ) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
Posted by CokeBell
|
#pragma comment(linker, "/subsystem:windows")

#include <windows.h>

#include <commctrl.h> // 공용 컨트롤 헤더.
#pragma comment( lib, "comctl32.lib") // comctl32.dll을 사용하기 위해.

// Tree 에 항목을 추가하는 함수.
HTREEITEM AddItem( HWND hTree, HTREEITEM hParent, char* s )
{
    TVINSERTSTRUCT tv;
    tv.hParent      = hParent;  // << -- 수정 하세요.
    tv.hInsertAfter = TVI_SORT;
    tv.item.pszText = s;  // << ------ 수정.
    tv.item.iImage  = 0;
    tv.item.iSelectedImage = 1;
    tv.item.mask    = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
    HTREEITEM hItem = (HTREEITEM)SendMessage( hTree, TVM_INSERTITEM, 0,
                                                (LPARAM)&tv);   
    return hItem;  // << 추가하세요.
}


void EnumFiles( HWND hTree, HTREEITEM hParent, char* path ) // << 수정.
{
    SetCurrentDirectory( path );
    WIN32_FIND_DATA wfd;

    HANDLE hFind = FindFirstFile( "*.*", &wfd );
    do
    {
        if ( ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) &&
            !( wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) )
        {
            //=========================================
            if ( strcmp( wfd.cFileName, ".")  != 0 &&
                 strcmp( wfd.cFileName, "..") != 0 )
            {
               
                HTREEITEM hItem = AddItem( hTree, hParent, wfd.cFileName);
                   
                EnumFiles( hTree, hItem, wfd.cFileName ); // 재귀 호출.



                SetCurrentDirectory("..");  // 다시 상위 폴더로.!
            }
            //=========================================
        }

    } while ( FindNextFile( hFind, &wfd ) );

    FindClose( hFind );
}








LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hTree;
   
    switch( msg )
    {   
    case WM_CREATE:
           
        InitCommonControls(); // 공용 컨트롤 초기화.

        // 1. Tree Control 생성하기.
        hTree = CreateWindow( WC_TREEVIEW, "",
           
            WS_CHILD | WS_VISIBLE | WS_BORDER | TVS_HASLINES | TVS_LINESATROOT |
            TVS_HASBUTTONS,

                            10,10,300,500, hwnd, (HMENU)1, 0, 0);

        {
            // 2. Tree에 ImageList 연결하기
            HIMAGELIST hImg = ImageList_Create( 16,15,    // image 크기.
                                ILC_COLOR16 | ILC_MASK, // 색상 | Mask 사용여부
                                            2,  // 초기 크기
                                            0); // Grow Size
            // 비트맵 Load
            HBITMAP hBitmap = (HBITMAP)LoadImage( 0, "folder.bmp",
                                                IMAGE_BITMAP, 0, 0,
                                                LR_LOADFROMFILE );

            ImageList_AddMasked( hImg, hBitmap, RGB(0,128,128));
            DeleteObject( hBitmap );

            // Tree에 ImageList를 연결한다.
            SendMessage( hTree, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)hImg);
        }


        // 2. Tree 항목 추가.!! - 해당하는 구조체를 만들어서 메세지로 전달한다.
        {
            EnumFiles( hTree, TVI_ROOT, "C:\\");

        }   
        return 0;











    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc( hwnd, msg, wParam, lParam);
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR      lpCmdLine, int nShowCmd )
{
    ATOM atom;
    WNDCLASS wc;
    HWND hwnd;
    MSG msg;
   
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hbrBackground= (HBRUSH)GetStockObject( WHITE_BRUSH );
    wc.hCursor        = LoadCursor( 0, IDC_ARROW );
    wc.hIcon        = LoadIcon( 0, IDI_APPLICATION);
    wc.hInstance    = hInstance;
    wc.lpfnWndProc  = WndProc;
    wc.lpszClassName= "First";
    wc.lpszMenuName = 0;
    wc.style        = 0;

    atom = RegisterClass( &wc);
   
    if ( atom == 0 )
    {
        MessageBox( 0, "Fail To RegisterClass", "Error", MB_OK);
        return 0;
    }

    hwnd = CreateWindowEx( 0, "first", "Hello", WS_OVERLAPPEDWINDOW,
                                CW_USEDEFAULT, 0, CW_USEDEFAULT,0, 0, 0,
                                hInstance, 0);
    ShowWindow( hwnd, nShowCmd);
    UpdateWindow( hwnd );

    while ( GetMessage( &msg, 0, 0, 0) )
    {                           
        TranslateMessage(&msg);
        DispatchMessage( &msg);
    }

    return 0;
}


Posted by CokeBell
|
//마우스 버튼시마다 게이지가 차오름
//파일전송이나 그외에 로딩시에 사용하면 좋아요.

#include <windows.h>

// 공용컨트롤 사용시 필요한 h....   
#include <commctrl.h>

// project -> setting --> link
//#pragma comment(lib, "comctl32.lib")

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static  HINSTANCE    hInst;
    static    HWND        hProgress;
    static int    Pos        = 0;
    switch( msg )
    {
    case WM_CREATE:
        // 공용 컨트롤 사용시 컨트롤 초기화...
        InitCommonControls();

        hInst        = ((LPCREATESTRUCT)lParam)->hInstance;
        hProgress    = CreateWindow("msctls_progress32",        "",
            WS_CHILD | WS_VISIBLE | WS_BORDER | PBS_SMOOTH,
            10, 10, 300, 20, hwnd, (HMENU)1, hInst, 0);

        // 컨트롤 초기화
        SendMessage( hProgress, PBM_SETRANGE32, 0, 100);
        SendMessage( hProgress, PBM_SETPOS,      0, 0);

        return 0;
    case WM_LBUTTONDOWN:
        Pos += 10;
        SendMessage(hProgress, PBM_SETPOS, Pos, 0);
        return 0;
    case WM_RBUTTONDOWN:
        Pos -= 10;
        SendMessage(hProgress, PBM_SETPOS, Pos, 0);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nShowCmd)
{
    // 1. 윈도우 클래스 만들기
    WNDCLASS wc;
    wc.cbWndExtra            = 0;
    wc.cbClsExtra            = 0;
    wc.hbrBackground        = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor                = LoadCursor(0, IDC_ARROW);
    wc.hIcon                = LoadIcon(0, IDI_APPLICATION);
    wc.hInstance            = hInstance;
    wc.lpfnWndProc            = WndProc;            // DefWindowProc;
    wc.lpszClassName        = "First";
    wc.lpszMenuName            = 0;
    wc.style                = 0;

    // 2. 등록(레지스트리에)
    RegisterClass(&wc);

    // 3. 윈도우 창 만들기
    HWND hwnd = CreateWindowEx( 0,                    // WS_EX_TOPMOST
                 "first",                // 클래스 명
                 "Hello",                // 캡션바 내용
                 WS_OVERLAPPEDWINDOW,
                 CW_USEDEFAULT , 0, CW_USEDEFAULT, 0,    // 초기 위치
                 0, 0,            // 부모 윈도우 핸들, 메뉴 핸들
                 hInstance,        // WinMain의 1번째 파라미터 (exe 주소)
                 0);            // 생성 인자



    // 4. 윈도우 보여주기
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);
   

    // 5. Message
    MSG msg;
    while( GetMessage( &msg, 0, 0, 0 ) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
Posted by CokeBell
|
#include <stdio.h>
#include <windows.h>

void EnumFiles( char* path )
{
    SetCurrentDirectory( path );
    WIN32_FIND_DATA wfd;

    HANDLE hFind = FindFirstFile( "*.*", &wfd );  
    do
    {
        if ( ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) &&
            !( wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) )
            printf( "%s\n", wfd.cFileName );

    } while ( FindNextFile( hFind, &wfd ) );

    FindClose( hFind );
}
/*

// 재귀 호출 버전.
void EnumFiles( char* path )
{
    SetCurrentDirectory( path );
    WIN32_FIND_DATA wfd;

    HANDLE hFind = FindFirstFile( "*.*", &wfd );
    do
    {
        if ( ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) &&
            !( wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) )
        {
            //=========================================
            if ( strcmp( wfd.cFileName, ".") != 0 &&
                 strcmp( wfd.cFileName, "..")!= 0 )
            {
                printf( "%s\n", wfd.cFileName );
                   
                EnumFiles( wfd.cFileName ); // 재귀 호출.
                SetCurrentDirectory("..");  // 다시 상위 폴더로.!
            }
            //=========================================
        }

    } while ( FindNextFile( hFind, &wfd ) );

    FindClose( hFind );
}

*/

void main()
{
    EnumFiles( "C:\\");
}
Posted by CokeBell
|
 
// 특정 윈도우의 정보 출력

#include <windows.h>
#include "resource.h"

// 함수....
void DrawInvertRect(HWND hwnd)
{
    RECT    rc;
    GetWindowRect(hwnd, &rc);        // GetClientRect(...)

    OffsetRect(&rc, -rc.left, -rc.top);        // 스크린 좌표 => 윈도우 좌표

    HDC hdc = GetWindowDC(hwnd);
    SetROP2(hdc, R2_NOT);

    HPEN    hPen        = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
    HPEN    oldPen        = (HPEN)SelectObject(hdc, hPen);
    HBRUSH    oldBrush    = (HBRUSH)SelectObject(hdc, GetStockObject(NULL_BRUSH));

    Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);

    SelectObject(hdc, oldBrush);
    DeleteObject(SelectObject(hdc, oldPen));
    ReleaseDC(hwnd, hdc);
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HICON        hFill, hEmpty;
    static HCURSOR        hCursor;
    static RECT            rc = { 50, 50 , 82, 82 };    // 32 * 32
    static HINSTANCE    hInst;

    static HWND hwndPrev = (HWND)-1;

    //---------------- 추가 --------------------------------
    static char info[512]    = "";
    static RECT rcText        = { 50, 100, 300, 300 };
    //------------------------------------------------------

    switch( msg )
    {
    case WM_MOUSEMOVE:
        // 1. 현재 마우스를 누가ㅣ 소유?? ( 본인소유..)
        if( GetCapture() == hwnd)
        {
            POINT pt;
            // 현재 마우스 포인터 위치?? 스크린 좌표...
            GetCursorPos(&pt);

            // 핸들값... 현재 마우스 포인터 아래의...
            HWND hCur = WindowFromPoint(pt);
            
            if( hCur != hwnd && hCur != hwndPrev)
            {
                // 이전의 핸들값..
                DrawInvertRect(hwndPrev);
                // 현재의 핸들값..
                DrawInvertRect(hCur);
                hwndPrev = hCur;

                // 정보 획득.-----------------------------------------------
                char name[256];
                GetClassName( hwndPrev, name, 256);
                RECT    r;        GetWindowRect(hwndPrev, &r);

                wsprintf(info, "HWND : 0x%08x\nClass : %s\nPosition : \
                    (%d , %d)-(%d , %d)",
                    hwndPrev, name, r.left, r.top, r.right, r.bottom);

                InvalidateRect(hwnd, &rcText, TRUE);
                //---------------------------------------------------------
            }
        }
        return 0;

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc            = BeginPaint(hwnd, &ps);
            DrawIcon( hdc, rc.left, rc.top, hFill);    
            //------------------------------------------------------------
            SetBkMode(hdc, TRANSPARENT);
            DrawText(hdc, info, -1, &rcText, DT_TOP | DT_LEFT);
            //-------------------------------------------------------------
            EndPaint(hwnd, &ps);
        }
        return 0;

    // 마우스 캡쳐가 해지 될 때 호출되는 핸들러..
    // 이 메시지에서 화면을 무효화 하면 Icon이 다시 그려진다...
    case WM_CAPTURECHANGED:
        InvalidateRect(hwnd, &rc, TRUE);
        //---------------- 추가 ---------------------------
        DrawInvertRect(hwndPrev);
        hwndPrev = (HWND)-1;
        //--------------------------------------------------
        return 0;

    // 초기화
    case WM_CREATE:
        // Instance 얻기..
        hInst        = ( ( LPCREATESTRUCT)lParam)->hInstance;

        hFill        = LoadIcon  ( hInst, MAKEINTRESOURCE(IDI_ICONFILL));
        hEmpty        = LoadIcon  ( hInst, MAKEINTRESOURCE(IDI_ICON_EMPTY));
        hCursor        = LoadCursor( hInst, MAKEINTRESOURCE(IDC_CURSOR_TARGET));
        return 0;


    case WM_LBUTTONDOWN:
        {
            POINT  pt        =  { LOWORD(lParam), HIWORD(lParam) };

            // 아이콘 영역 안인가??
            if( PtInRect( &rc, pt ) )
            {
                // 1. 마우스 캡쳐
                SetCapture(hwnd);

                // 2. 아이콘 변경
                HDC  hdc = GetDC(hwnd);
                DrawIcon(hdc, rc.left, rc.top, hEmpty);

                ReleaseDC(hwnd, hdc);

                // 3. 커서 변경
                SetCursor( hCursor);
            }
        }
        return 0;

    case WM_LBUTTONUP:
        if( GetCapture() == hwnd )
            ReleaseCapture();
        return 0;

    case WM_RBUTTONDOWN:
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nShowCmd)
{
    // 1. 윈도우 클래스 만들기
    WNDCLASS wc;
    wc.cbWndExtra            = 0;
    wc.cbClsExtra            = 0;
    //------------------------------------------------------------------
    wc.hbrBackground        = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    //-----------------------------------------------------------------
    wc.hCursor                = LoadCursor(0, IDC_ARROW);
    wc.hIcon                = LoadIcon(0, IDI_APPLICATION);
    wc.hInstance            = hInstance;
    wc.lpfnWndProc            = WndProc;            // DefWindowProc;
    wc.lpszClassName        = "Finder";
    wc.lpszMenuName            = 0;
    wc.style                = 0;

    // 2. 등록(레지스트리에)
    RegisterClass(&wc);

    // 3. 윈도우 창 만들기
    HWND hwnd = CreateWindowEx( 0,                    // WS_EX_TOPMOST
                 "Finder",                // 클래스 명
                 "Finder",                // 캡션바 내용
                 //--------------------------------------------------------------
                 WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~ WS_MAXIMIZEBOX ,
                 100 , 100, 300, 300,    // 초기 위치
                 //----------------------------------------------------------------
                 0, 0,            // 부모 윈도우 핸들, 메뉴 핸들
                 hInstance,        // WinMain의 1번째 파라미터 (exe 주소)
                 0);            // 생성 인자

    // 4. 윈도우 보여주기
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);
    

    // 5. Message
    MSG msg;
    while( GetMessage( &msg, 0, 0, 0 ) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}


Posted by CokeBell
|
/*간단한 타이머 응용*/

#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HDC  hdc;
    static int nx = 1, ny = 1, nxStop = 1;
    static int nxx = 203, nxxStop = 1;

    char szCho[30];
    RECT rc  = { 0, 0, 300, 70 };

    switch( msg )
    {
    case WM_KEYDOWN:
        if( LOWORD(wParam ) == VK_RETURN)    //Enter_Key 입력시 타이머 생성하여 작동을 보여줌
        {
            SetTimer(hwnd, 1, 10, NULL);
            SetTimer(hwnd, 2, 10, NULL);
        }
        if( LOWORD(wParam ) == VK_SPACE)    //Space_Key 입력시 타이머를 죽여 정지상태를 보여줌
        {
            KillTimer(hwnd, 1);
            KillTimer(hwnd, 2);
        }
        return 0;
    case WM_TIMER:
        hdc = GetDC(hwnd);
        InvalidateRect(hwnd, &rc, TRUE);
        UpdateWindow(hwnd);

        switch(wParam)
        {
        case 1:
            if( nxStop == 1 ) nx++;                //처음 왼쪽에서 오른쪽으로 한칸씩 옴겨 간다.       
            if( nx == 203 )  nxStop = 2;        //203이 될때 까지 203이 되면 nxStop가 2가 되면서
            if( nxStop == 2 ) nx--;                //이 식이 성립되어 이제는 1이될때까지 오른쪽에 왼쪽으로 이동
            if( nx == 1)  nxStop = 1;
            break;
        case 2:
            if( nxxStop == 1 ) nxx--;
            if( nxx ==1 )  nxxStop = 2;
            if( nxxStop == 2) nxx++;
            if( nxx == 203) nxxStop = 1;
            break;

        }
        TextOut(hdc, nx, ny, "텍스트 이동", 11);
        sprintf(szCho, "x좌표 : %d, y좌표 : %d", nxx, ny);
        TextOut(hdc, nxx, 40, szCho, strlen(szCho));
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nShowCmd)
{
    // 1. 윈도우 클래스 만들기
    WNDCLASS wc;
    wc.cbWndExtra            = 0;
    wc.cbClsExtra            = 0;
    wc.hbrBackground        = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor                = LoadCursor(0, IDC_ARROW);
    wc.hIcon                = LoadIcon(0, IDI_APPLICATION);
    wc.hInstance            = hInstance;
    wc.lpfnWndProc            = WndProc;            // DefWindowProc;
    wc.lpszClassName        = "First";
    wc.lpszMenuName            = 0;
    wc.style                = 0;

    // 2. 등록(레지스트리에)
    RegisterClass(&wc);

    // 3. 윈도우 창 만들기
    HWND hwnd = CreateWindowEx( 0,                    // WS_EX_TOPMOST
                 "first",                // 클래스 명
                 "Hello",                // 캡션바 내용
                 WS_OVERLAPPEDWINDOW,
                 CW_USEDEFAULT , 0, CW_USEDEFAULT, 0,    // 초기 위치
                 0, 0,            // 부모 윈도우 핸들, 메뉴 핸들
                 hInstance,        // WinMain의 1번째 파라미터 (exe 주소)
                 0);            // 생성 인자



    // 4. 윈도우 보여주기
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);
   

    // 5. Message
    MSG msg;
    while( GetMessage( &msg, 0, 0, 0 ) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
Posted by CokeBell
|
/*
WM_TIMER
SetTimer / KillTimer에 대해서 알아 보자.
*/

#include <windows.h>

void CALLBACK foo( HWND hwnd,    // window Handle
                  UINT uMsg,    // WM_TIMER message
                  UINT idEvent,    // timer id
                  DWORD dwTime) // current system time
{
    MessageBox(hwnd, "foo", "foo", MB_OK);
}


LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch( msg )
    {
    // 윈도우가 생성될 때 발생 => 초기화 코드
    case WM_CREATE:
//        SetTimer(hwnd, 1,1000,  foo);    // 1000을 주기로 foo함수 호출->메세지 박스 1초단위로 호출
        SetTimer(hwnd, 1, 1000, 0);        //1000은 1초 , 주기로 WM_TIMER을 실행->WM_PAINT
        return 0;

    case WM_TIMER:
        // timer ID값 확인..
        if( wParam == 1)
        {
            InvalidateRect(hwnd, 0, TRUE);    // 화면 무효화 1초 다위로 WM_PAINT실행
        }
        return 0;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            SYSTEMTIME st;        GetLocalTime(&st);        // 현재 시간 구하기
            char buf[256];
            GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, 0, buf, 256);
            RECT r;
            GetClientRect(hwnd, &r); //시간의 뿌려줄 박스 생성
            DrawText(hdc, buf, -1, &r, DT_SINGLELINE | DT_CENTER | DT_VCENTER);//화면에 시간 뿌려주기,
            EndPaint(hwnd, &ps);
        }
        return 0;
    case WM_DESTROY:
        KillTimer(hwnd, 1);            //종료시 settimer죽임.
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nShowCmd)
{
    // 1. 윈도우 클래스 만들기
    WNDCLASS wc;
    wc.cbWndExtra            = 0;
    wc.cbClsExtra            = 0;
    wc.hbrBackground        = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor                = LoadCursor(0, IDC_ARROW);
    wc.hIcon                = LoadIcon(0, IDI_APPLICATION);
    wc.hInstance            = hInstance;
    wc.lpfnWndProc            = WndProc;            // DefWindowProc;
    wc.lpszClassName        = "First";
    wc.lpszMenuName            = 0;
    wc.style                = 0;

    // 2. 등록(레지스트리에)
    RegisterClass(&wc);

    // 3. 윈도우 창 만들기
    HWND hwnd = CreateWindowEx( 0,                    // WS_EX_TOPMOST
                 "first",                // 클래스 명
                 "Hello",                // 캡션바 내용
                 WS_OVERLAPPEDWINDOW,
                 CW_USEDEFAULT , 0, CW_USEDEFAULT, 0,    // 초기 위치
                 0, 0,            // 부모 윈도우 핸들, 메뉴 핸들
                 hInstance,        // WinMain의 1번째 파라미터 (exe 주소)
                 0);            // 생성 인자



    // 4. 윈도우 보여주기
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);
   

    // 5. Message
    MSG msg;
    while( GetMessage( &msg, 0, 0, 0 ) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
Posted by CokeBell
|

#pragma comment(linker, "/subsystem:windows")

#include <windows.h>

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch( msg )
 { 
 // 아래 메세지가 DefWindowProc 에 가면 ALT + F4 등의 기능을 수행 되게 된다.
 case WM_SYSKEYDOWN:
  return 0;


 case WM_KEYDOWN:
  {
   int vCode = (int)wParam;

   // Scan Code 는 lParam 의 16~23 비트에 있다.
   int sCode = ( lParam & 0x00FF0000) >> 16;

   char s[256];
   wsprintf( s, "Scan Code : %d \nvirtual Key Code : %d", sCode, vCode);

   MessageBox( hwnd, s, "", MB_OK);
  }
  return 0;

     // 대 소문자 변경해서 Test 해 보세요
     // "A", "a" 가 같은 가상 키코드임을 확인 하세요..

 

 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return DefWindowProc( hwnd, msg, wParam, lParam);
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
     LPSTR   lpCmdLine, int nShowCmd )
{
 ATOM atom;
 WNDCLASS wc;
 HWND hwnd;
 MSG msg;
 
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hbrBackground= (HBRUSH)GetStockObject( WHITE_BRUSH );
 wc.hCursor  = LoadCursor( 0, IDC_ARROW );
 wc.hIcon  = LoadIcon( 0, IDI_APPLICATION);
 wc.hInstance = hInstance;
 wc.lpfnWndProc  = WndProc;
 wc.lpszClassName= "First";
 wc.lpszMenuName = 0;
 wc.style  = 0;

 atom = RegisterClass( &wc);
 
 if ( atom == 0 )
 {
  MessageBox( 0, "Fail To RegisterClass", "Error", MB_OK);
  return 0;
 }

 hwnd = CreateWindowEx( 0, "first", "Hello", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT,0, 0, 0,
        hInstance, 0);
 ShowWindow( hwnd, nShowCmd);
 UpdateWindow( hwnd );

 while ( GetMessage( &msg, 0, 0, 0) )
 {       
  TranslateMessage(&msg);
  DispatchMessage( &msg);
 }

 return 0;
}

// -> 화살표 키 : WM_KEYDOWN 만 발생.

// 기능키 : WM_KEYDOWN 에서 처리
// 문자키 : WM_CHAR 에서 처리

Posted by CokeBell
|


#include <windows.h>

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch( msg )
 {
// case WM_SYSKEYDOWN:
  // system keyboard는 반드시 defWindowProc에 보내야 한다.
  // 그래야 Alt + F4 같은 기본 기능이 지원 된다...
//  return 0;
//  return DefWindowProc(hwnd, msg, wParam, lParam);

  // Alt + X로 종료..
 case WM_SYSCHAR:
  {
   //
   if( wParam == 'X' || wParam == 'x')
   {
    // 자기자신 종료..
//    SendMessage(hwnd, WM_CLOSE, 0, 0); //WM_CLOSE 이벤트로 이동하여 종료함
    SendMessage(hwnd, WM_QUIT, 0, 0); //종료 이벤트 호출
    DestroyWindow(hwnd);    //윈도우를 죽인다.
    return 0;
   }
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);


  return 0;
 case WM_CLOSE:
  {
   UINT ret = MessageBox(hwnd, "정말로 끝내시렵니까?", "확인", MB_YESNO);
   if (ret == IDYES)
   {
    // 윈도우 파괴 -> WM_DESTROY 발생 => PostQuitMessage() => WM_QUIT
    DestroyWindow(hwnd);
   }
   
  }
  return 0;

 case WM_DESTROY:
  PostQuitMessage(0);  
  return 0;
 }
 return DefWindowProc(hwnd, msg, wParam, lParam);
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
       LPSTR lpCmdLine, int nShowCmd)
{
 // 1. 윈도우 클래스 만들기
 WNDCLASS wc;
 wc.cbWndExtra   = 0;
 wc.cbClsExtra   = 0;
 wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
 wc.hCursor    = LoadCursor(0, IDC_ARROW);
 wc.hIcon    = LoadIcon(0, IDI_APPLICATION);
 wc.hInstance   = hInstance;
 wc.lpfnWndProc   = WndProc;   // DefWindowProc;
 wc.lpszClassName  = "First";
 wc.lpszMenuName   = 0;
 wc.style    = 0;

 // 2. 등록(레지스트리에)
 RegisterClass(&wc);

 // 3. 윈도우 창 만들기
 HWND hwnd = CreateWindowEx( 0,     // WS_EX_TOPMOST
     "first",    // 클래스 명
     "Hello",    // 캡션바 내용
     WS_OVERLAPPEDWINDOW,
     CW_USEDEFAULT , 0, CW_USEDEFAULT, 0, // 초기 위치
     0, 0,   // 부모 윈도우 핸들, 메뉴 핸들
     hInstance,  // WinMain의 1번째 파라미터 (exe 주소)
     0);   // 생성 인자

 

 // 4. 윈도우 보여주기
 ShowWindow(hwnd, SW_SHOW);
 UpdateWindow(hwnd);
 

 // 5. Message
 MSG msg;
 while( GetMessage( &msg, 0, 0, 0 ) )
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 return 0;
}

Posted by CokeBell
|

//------------------------------------------------------------
// WM_MOUSELEAVE
//------------------------------------------------------------

#pragma comment(linker, "/subsystem:windows")

// 현재 시스템의 버전 지정
#define _WIN32_WINNT 0x0501  //
#define WINVER      0x0501  //

#include <windows.h>

// windows.h 안의 내용.
/*
#ifdef _WIN32_WINNT >= 0x0400    // 현재 시스템의 버전 확인

#define WM_MOUSELEAVE   xxx

#endif
*/

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 static BOOL bOver = FALSE;
 switch( msg )
 { 
 case WM_MOUSEMOVE:
  if ( bOver == FALSE ) // 밖에 있다 처음 들어 온 경우.
  {
   bOver = TRUE;

   SetWindowText( hwnd, "마우스가 윈도우 위에 있습니다."); // 캡션문자열 변경

   // WM_MOUSELEAVE 메세지를 요청한다.
   TRACKMOUSEEVENT tme;
   tme.cbSize  = sizeof( tme );
   tme.dwFlags = TME_LEAVE | TME_HOVER; // WM_MOUSEHOVER 도 요청
   tme.dwHoverTime = 1000; // HOVER 시간
   tme.hwndTrack   = hwnd;

   TrackMouseEvent( &tme );
  }
  return 0;

 case WM_MOUSEHOVER:
  bOver = FALSE;
  SetWindowText( hwnd, "마우스가 정지 했습니다.");
  return 0;

 case WM_MOUSELEAVE:
  bOver = FALSE; //<<--

  SetWindowText( hwnd, "마우스가 윈도우를 벗어났습니다.");
  return 0;

 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return DefWindowProc( hwnd, msg, wParam, lParam);
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
     LPSTR   lpCmdLine, int nShowCmd )
{
 ATOM atom;
 WNDCLASS wc;
 HWND hwnd;
 MSG msg;
 
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hbrBackground= (HBRUSH)GetStockObject( WHITE_BRUSH );
 wc.hCursor  = LoadCursor( 0, IDC_ARROW );
 wc.hIcon  = LoadIcon( 0, IDI_APPLICATION);
 wc.hInstance = hInstance;
 wc.lpfnWndProc  = WndProc;
 wc.lpszClassName= "First";
 wc.lpszMenuName = 0;
 wc.style  = 0;

 atom = RegisterClass( &wc);
 
 if ( atom == 0 )
 {
  MessageBox( 0, "Fail To RegisterClass", "Error", MB_OK);
  return 0;
 }

 hwnd = CreateWindowEx( 0, "first", "Hello", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT,0, 0, 0,
        hInstance, 0);
 ShowWindow( hwnd, nShowCmd);
 UpdateWindow( hwnd );

 while ( GetMessage( &msg, 0, 0, 0) )
 {       
  TranslateMessage(&msg);
  DispatchMessage( &msg);
 }

 return 0;
}


 

Posted by CokeBell
|