728x90

// 멤버 변수 추가.

HBITMAP m_bmpBackground;



// OnInitDialog() 에 추가.

m_bmpBackground = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance, "이미지 경로", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);



// OnPaint() 에 추가.

CPaintDC dc(this); // device context for painting

CBitmap bmp;

BITMAP bmpInfo;

CDC memDC;


bmp.Attach(m_bmpBackground);

bmp.GetBitmap(&bmpInfo);


memDC.CreateCompatibleDC(&dc);

memDC.SelectObject(bmp);


dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &memDC, 0, 0, SRCCOPY);


memDC.DeleteDC();

bmp.Detach();

bmp.DeleteObject();



위와 같이 추가를 해주면 다이얼로그에 이미지가 잘 입혀질 것이다.




728x90
728x90

아래의 코드를 그냥 인쇄하고 싶은 버튼에 넣으면 된다...


    // 인쇄 코드.

    int nWidth, nHeight;

    CClientDC dc(this);  //this->pImgWnd

    CDC MemDC;

    MemDC.CreateCompatibleDC(&dc);


    CRect rect;

    GetClientRect(rect);

    nWidth = rect.Width();

    nHeight = rect.Height();


    CBitmap BMP;

    BMP.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());

    CBitmap* pOldBitmap = MemDC.SelectObject(&BMP);

    MemDC.BitBlt(0, 0, nWidth, nHeight, &dc, 0, 0, SRCCOPY);


    /*

    SECJpeg* jpg = new SECJpeg();

    jpg->CreateFromBitmap(&MemDC,&BMP);

    jpg->SaveImage("Test.jpg");

    */


    HANDLE hDib;

    LPSTR pDib;

    LPBITMAPINFO lpBitInfo;

    HANDLE hlpBitInfo;

    //CBitmap BMP;


    //BMP.LoadBitmap(IDB_BITMAP1);


    hDib = GlobalAlloc(GHND, nWidth*nHeight * 3);

    pDib = (LPSTR)GlobalLock(hDib);

    hlpBitInfo = GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER) + sizeof(BITMAPINFO));

    lpBitInfo = (LPBITMAPINFO)GlobalLock(hlpBitInfo);


    //BITMAPINFO

    lpBitInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

    lpBitInfo->bmiHeader.biWidth = nWidth;

    lpBitInfo->bmiHeader.biHeight = nHeight;

    lpBitInfo->bmiHeader.biPlanes = 1;

    lpBitInfo->bmiHeader.biBitCount = 24;

    lpBitInfo->bmiHeader.biCompression = BI_RGB;

    lpBitInfo->bmiHeader.biSizeImage = nWidth * nHeight * 3;

    lpBitInfo->bmiHeader.biXPelsPerMeter = 0;

    lpBitInfo->bmiHeader.biYPelsPerMeter = 0;

    lpBitInfo->bmiHeader.biClrUsed = 0;

    lpBitInfo->bmiHeader.biClrImportant = 0;

    ////BITMAPINFO  


    HDC hdc = ::GetDC(this->m_hWnd);

    GetDIBits(hdc, (HBITMAP)BMP, 0, nHeight, pDib, lpBitInfo, DIB_RGB_COLORS);

    ::ReleaseDC(this->m_hWnd, hdc);


    static DOCINFO docinfo = { sizeof(DOCINFO), _T("IMAGE"), NULL };


    CPrintDialog dlg(FALSE);

    if (dlg.DoModal() == IDCANCEL)

        return;


    HDC hpdc = dlg.GetPrinterDC();

    int cx, cy;


    cy = GetDeviceCaps(hpdc, VERTRES);

    cx = GetDeviceCaps(hpdc, HORZRES);


    if (StartDoc(hpdc, &docinfo))

    {

        if (StartPage(hpdc))

        {

            StretchDIBits(hpdc,

                0, 0, cx, cy, 0, 0, nWidth, nHeight, pDib, lpBitInfo, DIB_RGB_COLORS, SRCCOPY);

            EndPage(hpdc);

        }

        EndDoc(hpdc);

    }

    ::RestoreDC(hpdc, -1);


출처 : http://frostguy.tistory.com/42

728x90
728x90

MFC는 기본적으로 글자 크기를 Dialog 전체적으로 바꾸게 되어 있다.


하지만 아래와 같이 작업을 해서 Item의 글자를 개별적으로 변경이 가능하다.


static CFont font;

LOGFONT logFont;


// Edit 컨트롤의 Font 정보를  LogFont에 가져온다.

GetDlgItem(IDC_EDIT_TOTAL)->GetFont()->GetLogFont(&logFont);


// Font 글자 설정.

logFont.lfWeight = 1000;

logFont.lfHeight = 30;


// logFont의 정보로 설정.

font.CreateFontIndirect(&logFont);


// Edit 박스의 Font를 설정.

GetDlgItem(IDC_EDIT_TOTAL)->SetFont(&font);




출처 : http://worhkd.tistory.com/entry/MFC-Dialog-Item%EB%93%A4%EC%9D%98-%EA%B8%80%EC%9E%90%ED%81%AC%EA%B8%B0-%EB%B3%80%EA%B2%BD

728x90
728x90

칼럼을 클릭했을 때, 오름차순 or 내림차순으로 List Control의 항목들을 정렬시키고 싶을 때에 이 코드를 추가하면 된다.


// 멤버 변수 추가.

int m_nSortColumn;

BOOL m_bAscending;



// OnLvnColumnclickListVariable 이벤트 메시지 처리기에 추가.

LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);


int column = pNMLV->iSubItem;

if (column == m_nSortedColumn)

{

    m_bAscending = !m_bAscending;

}

else

{

    m_bAscending = TRUE;

}


m_nSortedColumn = column;

int cnt = m_ListControl.GetItemCount();

CString* str = new CString[cnt];


for (int i = 0; i < cnt; ++i)

{

    str[i] = m_ListControl.GetItemText(i, column);

    m_ListControl.SetItemData(i, (DWORD)(LPCTSTR)str[i]);

}


m_ListControl.SortItems(CompareFunc, (LPARAM)m_bAscending);

delete[]str;


*pResult = 0;



// cpp에 전역 변수로 Compare함수 추가.

static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParam)

{

    BOOL Ascending = (BOOL)lParam;

    LPCTSTR s1 = (LPCTSTR)(DWORD)lParam1;

    LPCTSTR s2 = (LPCTSTR)(DWORD)lParam2;

    if (Ascending)

        return _tcscmp(s1, s2);

    else

        return -(_tcscmp(s1, s2));

    return 0;

}



출처 : http://blog.naver.com/PostView.nhn?blogId=hji0223&logNo=220661789914&categoryNo=0&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView

728x90
728x90

ListCtrl 에서 여러 개의 아이템을 한번에 선택해서 삭제하기 위해서 또 코드를 입력해야한다.



어려운 코드는 아니므로 설명은 생략하겠다.

728x90
728x90

CString은 MFC에서 제공되는 정말 좋은 클래스이지만, MFC가 아닌데에서는 사용할 수 없다는 점이 너무 가슴이 아픈것 같다...


개인적으로 자주 사용하는 애들만 정리해보았다.


- CString -> DWORD



- DWORD -> CString



- 원하는 문자 삭제




- 원하는 위치의 문자 or 문자열 삭제




- 문자열 비교




- Left, Mid, Right



728x90
728x90

Dialog 기반 프로그램에서는 Enter Key, Esc Key 를 입력받게 되면 프로그램이 종료되게 된다.


뭐 ESC 키에서는 그려러니 할 수 있는데, Enter 키에서 종료가 되어버리면 원치 않는 경우일 수 있다. 

왜냐하면, Edit Box에서 입력을 하기 위해 Enter 키를 눌렀거나, Button을 키보드로 누르기 위해 Enter 키를 누를 수 있기 때문이다.


이런 것을 일명 엔터 버그라고 부른다고 한다. (책에서...)


이럴 때에는 따로 Enter, Esc 키를 눌러도 종료가 되지 않게끔 추가 작업을 해줘야 한다.


728x90
728x90

wxWidgets은 LPGL License이고, C++ 에서는 꽤 대중화 된 GUI ToolKit이다.


하지만, 관련 번역 도서나 자료가 거의 없다.... 



하지만 괜찮은 사이트를 찾았기 때문에 시도를 해봐야지. ㅎㅎ


소프트웨어 연구실 CDism : http://www.softlab365.com


참고 사이트 : http://dev-skill.tistory.com/59



먼저, wxWidgets 홈페이지 (https://www.wxwidgets.org)에 가서 Windows Zip (28 MB) 을 다운로드 받는다.



받은 파일(wxWidgets-3.1.0.zip)의 압축을 풀고, Windows 와 Visual Studio를 사용하므로 wxWidgets-3.1.0\build\msw 경로로 이동을 한다.


해당 경로에는 wx_vc*** 버전이 있다. 자신의 Visual Studio에 맞춰서 실행 후 빌드하면 된다.



나의 경우 Visual Studio 2013을 사용하므로, wx_vc12.sln 을 실행했다.


sln 파일을 열면 24개의 프로젝트가 들어있는데, 이것들을 자신이 사용할 Platform(x86, x64) 에 맞게 설정한 후 일단 전부 Build 하자.




Build가 완료되었다면 기본적인 설치는 완료 된 것이다.


하지만, wxWidgets은 Install이 된 것이 아니기 때문에 몇가지 설정을 해줘야 한다.




mscv 폴더와 wx 폴더를 Include 경로에 포함시켜야 한다.





마지막으로, x86이면 vc_lib, x64면 vc_x64_lib를 포함시켜주면 된다.







드디어 wxWidgets을 개발할 준비가 되었다.

728x90

+ Recent posts