Programming/C Win32 MFC2009. 6. 15. 17:06

Ctrl-W 를 눌러,
클래스 위저드에서 다이얼로그 Object를 선택
Messages 에서 PreTranslateMessage를 선택하여
Add Function / Edit Code 를 한 뒤 아래의 코드를 넣어준다.


BOOL ClassName::PreTranslateMessage(MSG* pMsg)
{
     // TODO: Add your specialized code here and/or call the base class
     if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
          return TRUE;
          
     return CDialog::PreTranslateMessage(pMsg);
}

[링크 : http://lafirr.tistory.com/20]
Posted by 구차니
Programming/C Win32 MFC2009. 6. 15. 10:21
PreTranslateMessage() 를 추가 후에

if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) return TRUE;

를 사용하면 엔터, ESC로 종료되는것을 막을 수 있다.


만약에 Editbox에서 엔터로 입력을 받아들여야 할 경우에는, 위와 같이 하면 인식을 못하게 되므로

CWnd *w;
w = GetFocus();
if (w->GetDlgCtrlID() == IDC_CTRL_ID) ...

이런식으로 특정 포커스에서 인식하도록 연결해주면 될 듯?


[링크 : http://lafirr.tistory.com/20] PreTranslateMessage
[링크 : http://www.dreamy.pe.kr/zbxe/?mid=codeclip&category=5904&document_srl=5958] PreTranslateMessage
[링크 : http://purelab.org/zbxe/?mid=guruin&page=3&document_srl=250] 서브클래싱
Posted by 구차니
Programming/C Win32 MFC2009. 6. 12. 13:47
MFC에서 RichEdit 라는 녀석이 있다.

바로 요녀석


근데, 추가하고 컴파일 하고 실행하면.. 화면이 안뜬다!!!
이유는 모르겠지만, 해결 방법은

AfxInitRichEdit();

를 적정위치에 넣어주는 것이다.
메인 프로젝트의 컨스트럭터의 TODO에 넣어 주자!

[링크 : http://bear.sage.kr/60]
Posted by 구차니
Programming/C Win32 MFC2009. 6. 9. 22:20
K&R Style
int main(int argc, char *argv[])
{
    ...
    while (x == y) {
        something();
        somethingelse();
        if (some_error)
            do_correct();
        else
            continue_as_usual();
    }
    finalthing();
    ...
}

ANSI Style(Allman Style)
while(x == y)
{
    something();
    somethingelse();
}
finalthing();

BSD KNF Style
while (x == y) {
        something();
        somethingelse();
}
finalthing();

Whitesmiths style
void MyFunc ()
    {
    while (x == y)
        {
        something();
        somethingelse();
        }
 
    finalthing();
    }

GNU Style
static char *
concat (char *s1, char *s2)
{
    while (x == y)
      {
        something ();
        somethingelse ();
      }
    finalthing ();
}

Horstmann style
while (x == y) 
{   something();
    somethingelse();
    //...
    if (x < 0)
    {   printf("Negative");
        negative(x);
    } 
    else 
    {   printf("Positive");
        positive(x);
    }
}
finalthing();



[링크 : http://en.wikipedia.org/wiki/Indent_style]
Posted by 구차니
Programming/C Win32 MFC2009. 5. 28. 21:49
일반적으로 사용하는 구조체 초기화 방법은 아래와 같다.
struct address {
                 int street_no;
                 char *street_name;
                 char *city;
                 char *prov;
                 char *postal_code;
               };

struct address temp_address =
               { 0,
                 "st. green",
                 "Hamilton",
                 "Ontario",
                 "123-456");

위의 방법은 C89 의 방법이고
C99에서는 아래와 같이 특정변수만 제한적으로 초기화가 가능하다.

struct address {
                 int street_no;
                 char *street_name;
                 char *city;
                 char *prov;
                 char *postal_code;
               };

struct address temp_address =
{ .city = "Hamilton", .prov = "Ontario" };


[링크 : http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic]
Posted by 구차니
Programming/C Win32 MFC2009. 5. 26. 23:23
libjpeg.a 라는 녀석을 발견하고는 어떻게 생겼나 궁금증이 생겼다.

$ ll libjpeg.a
-rw-r--r-- 1 root root 166012 2007-10-01 23:36 libjpeg.a

$ file libjpeg.a
libjpeg.a: current ar archive

$ nm -A libjpeg.a
libjpeg.a:jcapimin.o:00000330 T jpeg_CreateCompress
libjpeg.a:jcapimin.o:         U jpeg_abort
libjpeg.a:jcapistd.o:         U jinit_compress_master
libjpeg.a:jcapistd.o:000001b0 T jpeg_start_compress
libjpeg.a:jctrans.o:000000c0 t compress_output
libjpeg.a:jctrans.o:         U jinit_c_master_control
libjpeg.a:jcparam.o:000008a0 t add_huff_table
libjpeg.a:jcparam.o:000000e2 r bits_ac_chrominance.3846
... 파일별로 반복
'
U,T,r 등은 symbol type 이라고 하며,
위의 U는 Undefined 을, T는 Text section(code) 을 의미한다.



$ ar -t libjpeg.a
jcapimin.o
jcapistd.o
jctrans.o
jcparam.o
jdatadst.o
...


$ objdump -x libjpeg.a
In archive libjpeg.a:

jcapimin.o:     file format elf32-i386
rw-r--r-- 0/0   2296 Oct  1 23:36 2007 jcapimin.o
architecture: i386, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

Sections:
SYMBOL TABLE:
RELOCATION RECORDS FOR [.text]:
... 파일별로 반복



mangling은 컴파일러에서 이름이 중복되지 않도록 독특한 이름을 지어주는 것으로
C++에서 overloading을 지원하기 하는데 사용되기도 한다고 한다. [링크 : http://rubyeye.kr/]

int _cdecl    f (int x) { return 0; }	//	_f
int _stdcall  g (int y) { return 0; }	//	_g@4
int _fastcall h (int z) { return 0; }	//	@h@4

위키피디아에서 참조한 녀석으로 MS 컴파일러가 C언어 맹글링하는 방식의 예제이다.
[링크 : http://en.wikipedia.org/wiki/Name_mangling]

그리고 이러한 녀석을 원래이름으로 돌려주는 유틸리티로 c++filt가 존재한다.
[참고 : http://kldp.org/node/68410]


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

indent style  (0) 2009.06.09
C99 구조체 초기화 하기  (0) 2009.05.28
신기한 코드 사이즈  (0) 2009.05.19
double형을 int 형으로 출력하면?  (0) 2009.05.15
전처리기를 이용한 디버깅용 선언문(#define)  (0) 2009.05.15
Posted by 구차니
Programming/C Win32 MFC2009. 5. 19. 10:50
8051에서는 for문으로 돌리면 용량이 팍팍 줄어드는데..
x86 intel visual studio 에서 컴파일 하면 용량이 차이가 전혀 나지 않는다

#include "stdio.h"

void main()
{
	int idx = 0;
	char temp = 0xAA;
#if 1
	for(idx = 0; idx < 8;idx ++)
		printf("%d\n",temp & (0x01 << idx));
#else
	printf("%d\n",temp & 0x01);
	printf("%d\n",temp & 0x02);
	printf("%d\n",temp & 0x04);
	printf("%d\n",temp & 0x08);
	printf("%d\n",temp & 0x10);
	printf("%d\n",temp & 0x20);
	printf("%d\n",temp & 0x40);
	printf("%d\n",temp & 0x80);
#endif
}

어찌된게.. for문으로 돌리던, 그냥 하던 4개를 주석처리하던 용량은 똑같은 40,960 바이트이다
자체 압축을 지원한다고 해도 한두바이트 정도는 차이가 나지 않을까 싶긴한데..
그게 아니라면 블럭단위로 저장을 해서 티가 안나는 것일려나.. (정확하게 40KB이다)

 



Posted by 구차니
Programming/C Win32 MFC2009. 5. 15. 19:37
cinfo.output_gamma [930841904] <- int 형으로 출력
cinfo.output_gamma [1.000000]   <- double 형으로 출력


libjpeg 사용하다 디버그 문장을 제대로 안골라서 발생한 오류 -ㅁ-
Posted by 구차니
Programming/C Win32 MFC2009. 5. 15. 19:21
Before


void main()
{
int test = 13;
printf("\ntest [%ld:0x%lX]",test,test);
}

After
#define debug_print(name) printf("\n%s [%ld:0x%lX]",#name,name,name);
void main()
{
int test = 13;
debug_print(test);
}

#define debug_print(name) printf("\n%s [%ld:0x%lX]",#name,name,name);
전처리기에서 #name은 name의 내용을 문자열로 치환해주는 역활을 한다.

다른 용법은 아래 참고, ## 라는 용법도 있는데 두개를 하나로 붙여 준다.
[참고 : http://cafe.naver.com/devctrl/1921]
Posted by 구차니
Programming/C Win32 MFC2009. 4. 29. 12:06
글쓸 꺼리를 준 친구 녀석에게 감사를 ㅋㅋ

간단하게 설명을 하자면,
for문을 돌릴때 어느 시점에서 증가가 이루어지고, ++연산자가 적용되는 시점, 그리고 연산자 우선순위 대한 문제이다.
(개인적으로 이런 문제 싫어 한다. 가독성 지랄 같이 하면 다른 사람이 어떻게 수정하라고 ㄱ-)
아무튼 for문의 ([초기화];[조건];[증가]) 에서 증가문은 마지막 닫히는 } 부분에서 증가가 이루어 지고,
이로 인해서 더해지는 값이 달라지는 현상이 발생이 되게 된다.
65짜리는 2에서 11 까지 더하게 되고
55짜리는 1에서 10 까지 더하게 된다.

같은 i < 11 조건이지만,
증가되고 더해지고, 더해지고 증가됨의 차이가 있기 때문에 결과는 55와 65로 벌어지게 된다.


원본 코드 - 결과 65 짜리
sum = 0 ;
i = 1 ;
for( ; i<11 ;)
    sum += ++i ;

변형된 코드 1 - for문에 초기화 넣어줌
for(sum = 0,i=1;i<11;)
    sum += ++i;

변형된 코드 2 - while문으로 변형
sum = 0 ;
i=1;
while(i<11)
{
    sum += ++i;
}
변형된 코드 3 - goto문으로 변형
sum = 0 ;
i = 1;
while_loop:
{
    if(i<11) ;
    else break;

    ++i;
    sum += i;
}
goto while_loop:

원본 코드 - 결과 값 55 짜리
sum = 0 ;
i = 1 ;
for( ; i<11 ; ++i)
sum += 1 ;

변형된 코드 1 - for문에 초기화 넣어줌
for(sum = 0,i=1;i<11;++i)
    sum += 1;


변형된 코드 2 - for문에 초기화 넣어줌
sum = 0 ;
i=1;
while(i<11)
{
    sum += 1;
    ++i;
}

변형된 코드 3 - goto문으로 변형
sum = 0 ;
i =1;
while_loop:
{
    if(i<11) ;
    else break;

    sum += 1;
    ++i;
}
goto while_loop:
Posted by 구차니