MFC CheckBox 컨트롤의 현재 상태

Programming/MFC 2016. 10. 19. 17:31 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

      BOOL bCheck = IsDlgButtonChecked(IDC_CHECK);

 

      //MFC CheckBox 컨트롤의 현재 상태를 얻어오는 예제입니다.

      //    bCheck 변수가 1 이면 현재 체크박스가 체크되어 있는 상태를 의미하며 반대로 0이면 체크해제되어 있는 상태입니다.

 

      CheckDlgButton(IDC_CHECK, TRUE);

 

      // MFC CheckBox 컨트롤을 체크 및 체크해제 하는 예제입니다.

      //    두번째 매개변수가 TRUE일 경우 해당 체크박스에 체크되며 FALSE일 경우에는 체크가 해제됩니다.


       if (!IsDlgButtonChecked(IDC_TIME_CHECK))

      {

            return;

      }

'Programming > MFC' 카테고리의 다른 글

CTextProgressCtrl hide Edge  (0) 2016.10.25
MFC CWnd Control Border Color Change  (0) 2016.10.20
MFC Control Color Change  (0) 2016.10.19
MFC Bitmap Button  (0) 2016.10.18
MFC Tab Control Color Change #2  (0) 2016.10.18

MFC Control Color Change

Programming/MFC 2016. 10. 19. 17:20 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC Control Color Change






afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);


 

 

      CBrush m_combo_brush;

      m_combo_brush.CreateSolidBrush(RGB(0, 0, 255)); // Brush 속성을 생성한다.





HBRUSH MyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

      HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

 

      // TODO:  여기서 DC의 특성을 변경합니다.

 

      switch (nCtlColor) {

           

      case CTLCOLOR_STATIC:

            pDC->SetTextColor(RGB(255, 0, 0));

            pDC->SetBkColor(RGB(0, 0, 0));

            return (HBRUSH)(m_combo_brush);

      case CTLCOLOR_LISTBOX:

            pDC->SetTextColor(RGB(0, 255, 0));

            pDC->SetBkColor(RGB(0, 0, 0));

            return (HBRUSH)(m_combo_brush);

      default:

            break;

      }

      if (pWnd->m_hWnd == GetDlgItem(IDC_SERVERLIST_COMBO)->m_hWnd)

            hbr = HBRUSH(m_combo_brush);

 

      // TODO:  기본값이 적당하지 않으면 다른 브러시를 반환합니다.

      return hbr;

}

 




pDC

자식 창에 대 한 디스플레이 컨텍스트를 포인터를 포함합니다. 일시적일 수 있습니다.

pWnd

컨트롤의 색을 요청에 대 한 포인터를 포함 합니다. 일시적일 수 있습니다.

nCtlColor

컨트롤의 형식을 지정 하는 다음 값 중 하나가 포함 됩니다.

  • CTLCOLOR_BTN 단추 컨트롤

  • CTLCOLOR_DLG 대화 상자

  • CTLCOLOR_EDIT 편집 컨트롤

  • CTLCOLOR_LISTBOX 목록 상자 컨트롤

  • CTLCOLOR_MSGBOX 메시지 상자

  • CTLCOLOR_SCROLLBAR 스크롤 막대 컨트롤

  • CTLCOLOR_STATIC 정적 컨트롤



'Programming > MFC' 카테고리의 다른 글

MFC CWnd Control Border Color Change  (0) 2016.10.20
MFC CheckBox 컨트롤의 현재 상태  (0) 2016.10.19
MFC Bitmap Button  (0) 2016.10.18
MFC Tab Control Color Change #2  (0) 2016.10.18
MFC Tab Control Color Change #1  (1) 2016.10.18

MFC Bitmap Button

Programming/MFC 2016. 10. 18. 13:22 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC Bitmap Button



BitmapButton

ImageButton



1. Button Property


[Owner Draw] : True










2. Add Member Variable









3. Change Member Variable Type



CButton -> CBitmapButton








4. Load Bitmaps









m_Connect_Btn.LoadBitmaps(IDB_BITMAP_CONNECT_RESOURCE, IDB_BITMAP_CONNECT_SEL, IDB_BITMAP_CONNECT_FOCUS, IDB_BITMAP_CONNECT_DISABLED)
m_Connect_Btn.SizeToContent();








MFC Tab Control Color Change #2

Programming/MFC 2016. 10. 18. 10:57 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC Tab Control Color Change #2





Change Tab Selector? Color




override DrawItem function




void CMainTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

	COLORREF m_select_border_color = RGB(255, 255, 255);
	COLORREF m_select_text_color = RGB(10, 155, 202);
	COLORREF m_unselect_border_color = RGB(255, 255, 255);
	COLORREF m_unselect_text_color = RGB(0, 0, 0);


	int select_index = lpDrawItemStruct->itemID;
	if (select_index < 0) return;

	char tab_text[40];

	TC_ITEM data;
	data.mask = TCIF_TEXT | TCIF_IMAGE;
	data.pszText = tab_text;
	data.cchTextMax = 39;

	// 선택된 탭의 정보를 얻는다.
	if (!GetItem(select_index, &data)) return;

	CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	CRect rect = lpDrawItemStruct->rcItem;

	// Tab이 그려진 테두리의 두께만큼 위치를 보정한다.
	rect.top += ::GetSystemMetrics(SM_CYEDGE);

	pDC->SetBkMode(TRANSPARENT);

	// 탭이 선택된 정보에 따라 배경색을 칠해준다.
	if (select_index == GetCurSel()) pDC->FillSolidRect(rect, m_select_border_color);
	else pDC->FillSolidRect(rect, m_unselect_border_color);

	// 이미지를 출력한다.
	CImageList *p_image_list = GetImageList();
	if (p_image_list != NULL && data.iImage >= 0) {
		rect.left += pDC->GetTextExtent(" ").cx;

		IMAGEINFO image_info;
		p_image_list->GetImageInfo(data.iImage, &image_info);
		CRect image_rect(image_info.rcImage);

		p_image_list->Draw(pDC, data.iImage, CPoint(rect.left, rect.top), ILD_TRANSPARENT);
		rect.left += image_rect.Width();
	}

	CFont *p_old_font = NULL;

	if (select_index == GetCurSel()){
		// 선택된 탭이라면...
		pDC->SetTextColor(m_select_text_color);

		// 텍스트의 위치를 보정하여 선택된 느낌이 강조되도록 만든다.
		rect.top -= ::GetSystemMetrics(SM_CYEDGE);
		pDC->DrawText(tab_text, rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
	}
	else {
		// 선택되지 않은 탭이라면...
		pDC->SetTextColor(m_unselect_text_color);
		pDC->DrawText(tab_text, rect, DT_SINGLELINE | DT_BOTTOM | DT_CENTER);
	}

	pDC->SelectObject(p_old_font);
}




그리고


DrawItem 이벤트를 발생시키기 위하여



Dialog 에서






m_TabCtrl.ModifyStyle(0, TCS_OWNERDRAWFIXED);


를 불러 주어야 한다.

MFC Tab Control Color Change #1

Programming/MFC 2016. 10. 18. 10:34 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC Tab Control Color Change


Erase Background


Tab Control 의 배경 부분의 색상을 선택 할 수 있다.










TabControl 을



CTabCtrl 을 상속 받는 별개의 클래스로 구현하여




 

BEGIN_MESSAGE_MAP(CMainTabCtrl, CTabCtrl)

      ON_WM_ERASEBKGND()

END_MESSAGE_MAP()





메세지 맵에 추가한 후











BOOL CMainTabCtrl::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

	CRect rect;

	GetClientRect(&rect);

	CBrush myBrush(RGB(255, 255, 255));    // dialog background color <- 요기 바꾸면 됨.

	COLORREF color_data = RGB(64, 128, 255);


	CBrush *pOld = pDC->SelectObject(&myBrush);

	BOOL bRes = pDC->PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY);

	pDC->SelectObject(pOld);    // restore old brush

	return bRes;                       // 	return CTabCtrl::OnEraseBkgnd(pDC);
}



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

링커 도구 경고 LNK4098


LINK : warning LNK4098: 'LIBCMT' defaultlib가 다른 라이브러리와 충돌합니다. /NODEFAULTLIB:library를 사용하십시오.





호환되지 않는 라이브러리에 링크하려고 했습니다.

System_CAPS_note참고

런타임 라이브러리에는 여러 형식이 혼합 사용되지 않도록 하는 지시문이 들어 있는데  여러 형식이나 디버그/비디버그 버전의 런타임 라이브러리를 동일한 프로그램에서 사용하려고 하면 이 경고가 발생합니다.  예를 들어, 어떤 종류의 런타임 라이브러리를 사용하는 파일을 컴파일하고 다른 종류의 런타임 라이브러리를 사용하는 파일을 컴파일한 다음(예: 단일 스레드 라이브러리와 다중 스레드 라이브러리) 이 둘을 링크시키려고 하면 이 경고가 발생합니다.  동일한 런타임 라이브러리를 사용하는 소스 파일을 컴파일해야 합니다.  자세한 내용은 런타임 라이브러리 사용(/MD/MT,/LD) 컴파일러 옵션을 참조하십시오.  

링커의 /VERBOSE:LIB 스위치를 사용하여 링커가 검색 중인 라이브러리를 확인할 수 있습니다.  예를 들어, LNK4098이 발생하여 단일 스레드된 비디버그 런타임 라이브러리를 사용하는 실행 파일을 만들려는 경우에는 /VERBOSE:LIB 옵션을 사용하여 링커에서 검색 중인 라이브러리를 확인하십시오.  링커는 검색한 라이브러리로 LIBC.lib를 출력하며 LIBCMT.lib, MSVCRT.lib, LIBCD.lib, LIBCMTD.lib 또는 MSVCRTD.lib는 출력하지 않습니다.  무시할 각 라이브러리에 대해 /NODEFAULTLIB를 사용하여 링커가 잘못된 런타임 라이브러리를 무시하도록 할 수 있습니다.  

다음 표는 사용할 런타임 라이브러리에 따라 무시해야 하는 라이브러리를 보여 줍니다.

사용할 런타임 라이브러리

무시해야 하는 라이브러리

단일 스레드(libc.lib)

libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

다중 스레드(libcmt.lib)

libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

DLL을 사용하는 다중 스레드(msvcrt.lib)

libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

디버그 단일 스레드(libcd.lib)

libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib

디버그 다중 스레드(libcmtd.lib)

libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib

DLL을 사용하는 디버그 다중 스레드(msvcrtd.lib)

libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib






1. DLL을 사용하는 다중 스레드(msvcrt.lib) 일경우








336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

공유 DLL에서 MFC 사용 VS 정적 라이브러리에서 MFC 사용 


이 둘의 차이점?










공유 DLL에서 MFC 사용(Use MFC in a Shared DLL) : 응용프로그램 배포 시 mfc**.dll 파일을 함께 배포.
정적 DLL에서 MFC 사용(Use MFC in a Static Library) : 응용프로그램의 실행 파일에 mfc**.dll 이 포함되어 배포되기 때문에 응용프로그램만 배포.













기본적으로 "Use MFC in a Shared DLL" 가 설정되어 있습니다. 이 설정은 현재 개발중인 프로그램이 필요로 하는 라이브러리를 기본적으로 제공되는 DLL에서 참조하여 사용하겠다는 뜻입니다. 따라서 이 모드로 컴파일을 하여 실행파일을 배포하려면, 해당 컴파일에 Visual C++가 설치되어 있거나 다음과 같은 DLL이 있어야 합니다. mfc42d.dll, mfco42d.dll, msvcirtd.dll, msvcrtd.dll 물론 이 네 종류의 DLL 파일이 모두 있어야 하는 것은 아닙니다. 개발된 프로그램의 성격에 따라서 이 중 한 개정도가 필요 없을 때도 있습니다.

이 DLL은 이름이 mfc42d.dll과 같이 d로 끝나는데, 이 d는 "Debug" 의 약자로 생각하시면 됩니다. 이 파일들은 윈도우 시스템이 설치된 폴더의 "system32" 폴더 아래에 있습니다. 필요하다면, 해당 폴더에서 이 dll들을 복사해서 실행파일을 배포할 때 같이 배포하면 됩니다. 사실, 어떤 경우에 보면, 실행파일은 크기가 얼마되지 않는데 같이 붙어 다니는 dll의 사이즈가 엄청 큰 이상한 경우가 발생 하기도 합니다."Use MFC in a Static Library" 로 설정되어 있는 경우 컴파일을 하고 나서 실행파일을 배포할 때 별도의 dll을 같이 제공할 필요가 없습니다. 실행파일만 제공하면 되죠. 하지만, 이 방법은 별도의 dll이 없는 반면에 실행 파일의 사이즈가 좀 크다는 단점이 있습니다.
 
이 두 가지를 놓고 볼 때, 다음과 같이 일반적인 결론을 내릴 수 있습니다. 단순히 하나의 실행파일을 가지는 프로그램인 경우, "Use MFC in a Static Library" 를 사용해서 컴파일 하는 것이 비교적 유리하고 여러 개의 실행파일과 또는 dll이 사용되는 프로그램인 경우 각각의 실행파일 사이즈를 줄일 수 있는 "Use MFC in a Shared DLL"을 사용하는 것이 더 유리하다고 할 수 있습니다. 따라서 개발자가 이 두 가지 상황을 잘 판단해서 사용하면 될 것 같습니다.





  배포 시 응용프로그램만 배포하는게 관리하기도 편하고 오작동의 가능성도 적기 때문에 "정적 DLL 에서 MFC 사용" 으로 프로젝트를 설정하여 개발하게 된다.

  응용프로그램이 DLL 일 경우 위와 같이 설정하면 컴파일 시 다음과 같은 오류 메시지가 발생한다.
fatal error C1189: #error :  Please use the /MD switch for _AFXDLL builds

다음과 같이 설정해 주자.


1. 전처리기 정의

C/C++ → 전처리기 → 전처리기 정의
"_AFXDLL" 추가




2. 코드 생성

C/C++ → 코드 생성 → 런타임 라이브러리
Debug 모드일 경우    : "다중 스레드 디버그 DLL(/MDd)" 설정
Release 모드일 경우 :  "다중 스레드 DLL(/MD)" 설정







참고 : http://six605.tistory.com/466

참고 : https://social.msdn.microsoft.com/Forums/ko-KR/ba6bfe1c-8f80-45ea-809b-ec543dd6dc31/-dll-mfc-vs-mfc-?forum=asppnetko



Hiredis Subscribe/Publish with CWinThread

Programming/Redis 2016. 10. 5. 14:01 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Hiredis Subscribe/Publish



CWinThread 를 이용한 구현




struct event_base *base = event_base_new();

class CRedisConnect : public CWinThread
{
public:
	redisAsyncContext *c;
	// CWinThread extends
	virtual BOOL InitInstance();
	virtual int Run();
};

BOOL CRedisConnect::InitInstance()
{
	return TRUE;
}

int CRedisConnect::Run()
{
	c = redisAsyncConnect(redisServerIP, redisServerPort);
	if (c->err) {
		/* Let *c leak for now... */
		return 1;
	}
	redisLibeventAttach(c, base);

	int re2 = redisAsyncCommand(c, getCallback, NULL, "SUBSCRIBE foo");

	event_base_dispatch(base);

	return (0);
}



void getCallback(redisAsyncContext *c, void *r, void *privdata) {

	redisReply *reply = (redisReply *)r;
	if (reply == NULL)
	{
		LOG4CXX_DEBUG(g_log, "Subcribe reply == NULL");
	}
	// reply->type
	// #define REDIS_REPLY_STRING 1
	// #define REDIS_REPLY_ARRAY 2
	// #define REDIS_REPLY_INTEGER 3
	// #define REDIS_REPLY_NIL 4
	// #define REDIS_REPLY_STATUS 5
	// #define REDIS_REPLY_ERROR 6
	else if (reply->type == REDIS_REPLY_ERROR)
	{
		LOG4CXX_DEBUG(g_log, "Subcribe reply type == REDIS_REPLY_ERROR");
	}
	else if (reply->type == REDIS_REPLY_ARRAY)
	{
		LOG4CXX_DEBUG(g_log, "reply->elements == " << reply->elements);
		LOG4CXX_DEBUG(g_log, "reply->len == " << reply->len);
		for (int i = 0; i < reply->elements; i++)
		{
			if (reply->element[i]->str != NULL)
			LOG4CXX_DEBUG(g_log, "Subcribe reply array [" << i << "] == " << reply->element[i]->str);			
		}		
	}
	else
	{
		LOG4CXX_DEBUG(g_log, "getCallback reply str : " << reply->str);
	}
}

'Programming > Redis' 카테고리의 다른 글

Hiredis SMEMBERS 활용  (0) 2017.01.24
Redis Client Connect Test  (0) 2016.10.26
How to use Pub/sub with hiredis in C++?  (0) 2016.09.29
hiredis fatal error C1853:  (0) 2016.09.29
hiredis MFC import Visual Studio 2013  (0) 2016.09.28

hiredis MFC import Visual Studio 2013

Programming/Redis 2016. 9. 28. 11:49 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

hiredis MFC import




Hiredis is a minimalistic C client library for the Redis database.

It is minimalistic because it just adds minimal support for the protocol, but at the same time it uses a high level printf-alike API in order to make it much higher level than otherwise suggested by its minimal code base and the lack of explicit bindings for every Redis command.


1. Download Hiredis

Project Site : https://github.com/redis/hiredis


[Clone or download] [Download ZIP]




2. Include Hiredis Header Files



3. Config Hiredis Header Files Path







4. Build Hiredis Library File


Open Hiredis Project





Build Hiredis Project





5. Config Hiredis Library File Path





6. Sample Code




#include 
#include 
#include 

#include "hiredis.h"

#ifdef HIREDIS_WIN
#define snprintf sprintf_s
#endif

int main(void) {
    unsigned int j;
    redisContext *c;
    redisReply *reply;

    struct timeval timeout = { 1, 500000 }; // 1.5 seconds
    c = redisConnectWithTimeout((char*)"127.0.0.1", 6379, timeout);
    if (c->err) {
        printf("Connection error: %s\n", c->errstr);
        exit(1);
    }

    /* PING server */
    reply = redisCommand(c,"PING");
    printf("PING: %s\n", reply->str);
    freeReplyObject(reply);

    /* Set a key */
    reply = redisCommand(c,"SET %s %s", "foo", "hello world");
    printf("SET: %s\n", reply->str);
    freeReplyObject(reply);

    /* Set a key using binary safe API */
    reply = redisCommand(c,"SET %b %b", "bar", 3, "hello", 5);
    printf("SET (binary API): %s\n", reply->str);
    freeReplyObject(reply);

    /* Try a GET and two INCR */
    reply = redisCommand(c,"GET foo");
    printf("GET foo: %s\n", reply->str);
    freeReplyObject(reply);

    reply = redisCommand(c,"INCR counter");
    printf("INCR counter: %lld\n", reply->integer);
    freeReplyObject(reply);
    /* again ... */
    reply = redisCommand(c,"INCR counter");
    printf("INCR counter: %lld\n", reply->integer);
    freeReplyObject(reply);

    /* Create a list of numbers, from 0 to 9 */
    reply = redisCommand(c,"DEL mylist");
    freeReplyObject(reply);
    for (j = 0; j < 10; j++) {
        char buf[64];

        snprintf(buf,64,"%d",j);
        reply = redisCommand(c,"LPUSH mylist element-%s", buf);
        freeReplyObject(reply);
    }

    /* Let's check what we have inside the list */
    reply = redisCommand(c,"LRANGE mylist 0 -1");
    if (reply->type == REDIS_REPLY_ARRAY) {
        for (j = 0; j < reply->elements; j++) {
            printf("%u) %s\n", j, reply->element[j]->str);
        }
    }
    freeReplyObject(reply);

    return 0;
}


7. Sample Monitor






'Programming > Redis' 카테고리의 다른 글

Redis Client Connect Test  (0) 2016.10.26
Hiredis Subscribe/Publish with CWinThread  (0) 2016.10.05
How to use Pub/sub with hiredis in C++?  (0) 2016.09.29
hiredis fatal error C1853:  (0) 2016.09.29
Windows7 Redis 설치 및 실행  (0) 2016.09.27

MFC Dialog Modal

Programming/MFC 2016. 9. 22. 16:48 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

부모 Dialog 에서





자식 Dialog를 Domodal로 부른 뒤


  void CMyDialog::OnMenuShowSimpleModal()
{
   CSimpleDlg myDlg;
   INT_PTR nRet = myDlg.DoModal();

   if (nRet == IDOK || nRet == 5)
      AfxMessageBox(_T("Dialog closed successfully"));
}



자식 Dialog가 종료 될때




  void CSimpleDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
   UNREFERENCED_PARAMETER(nFlags);
   // Do something

   int nRet = point.x; // Just any value would do!
   EndDialog(nRet); // This value is returned by DoModal!

   // Do something

   return; // Dialog closed and DoModal returns only here!
}