커서 모양을 바꾸려면 윈도우 클래스를 작성할 때 원하는 커서 정보를 넘기면 된다.

WndClass.hCursor = LoadCursor(NULL, IDC_ARROW) ;

보통은 이런 식으로 정하는데, 뒷 부분의 LoadCursor 함수가 바로 커서를 읽어 오는 함수이다.

함수 원형은

HCURSOR LoadCursor( HINSTANCE hInstance, LPCTSTR lpCursorName) ;

이다.

첫 번째 인수 hInstance는 커서를 가지고 있는 프로그램의 인스턴스 핸들이지만 기본 제공하는 표준 커서를 사용하려면 NULL

로 지정한다.

윈도우즈의 디폴트 커서는 다음과 같다...

IDC_ARROW : 흔히 보는 화살표 모양이다.

IDC_CROSS : 십자 모양의 커서이다.

IDC_IBEAM : editbox 같은 문자위에 마우스가 올라갔을 떄 나오는 1자형 커서이다.

IDC_NO : 원안에 빗금이 쳐져잇는 모양의 커서이다.

IDC_Wait : 모래시계 모양의 커서이다.

'프로그래밍 > API' 카테고리의 다른 글

[API] 다양한 현재시간과 현재날짜 얻기  (1) 2011.08.05
[API] DC ( Device Context ) 란..........  (0) 2011.08.03
[API] 메시지 루프  (0) 2011.08.02
[API] 윈도우 생성..  (0) 2011.08.02
[API] 윈도우 클래스  (0) 2011.08.01
Posted by 바람처럼..
|


흔히 코딩을 짜다보면 현재 true 라면 false를..

반대로 false라면 true를 만들거나, 리턴해야 하는 상황이 있다.

그럴때

if( 변수 == true )
{
       변수 = false ;
}else
{
       변수 = true ;
}

이렇게 넣어주거나......

bool BoolChange(bool 변수)
{
        return !변수 ;
}


함수를 만들어 쓸수도 있다.....

하지만 ? 와 : 만 있으면 한줄로 해결 할 수 있다.

바로 글 제목 처럼

bool 변수 = 변수 ? false : true ;

라고 입력하면 된다.. 저 ? 와 : 의 사용 방법은...

A ? B : C ; 라고 생각했을 때 A가 참이면 B를 리턴, 거짓이면 C를 리턴한다.

예를 들어 보면..

bool b = true ;

b = b ? false : true ; 
라고 하면 b 에는 b가 현재 참이기 때문에 : 앞에 있는 false가 리턴되서 b는 false 로 바뀌게 된다. 

A 위치에는 다른 조건들도 가능하니.. 많이 활용하면 좋을 듯....

Posted by 바람처럼..
|


이번 서울, 부산 지역 폭우에도.. 무더운 날씨만 계속 되고 가벼운 소나기만 오던 대구에....

갑작스럽게 비가 무섭게 쏟아지네요....


요즘 하늘이 흐리기는 했지만....

지금 안개 끼고, 빗줄기가 정말 억수같이 쏟아지고 있습니다...

지금 까지 그래도 위치 상 비 피해가 없어 다행이였는데......

으악!! 지금도 천둥이....

흠.. 근데 한 20분 내리더니... 갑자기 또 그치네요 ;;;

이거 정말 우리나라가.. 동남아 기후로 바뀌는 걸까요?? 순간 정말 드는 느낌이 흔히 TV에서나 보던 스콜 같았는데...

한순간에 그치다니... ㅎㅎ 정말 요즘 날씨.. 대박입니다. ㅎㅎ
Posted by 바람처럼..
|


점심 시간에 인터넷 서핑을 하던 중.. 무언가.. 낚시글 같은 제목을 발견했다...

영수증이 성기능 장애를 일으킬 수 있다는 것이였다 - _-;;

기사 원문 보기

흠.. 그래도 왠지 클릭해 보고 싶은 마음에 클릭을 하고 들어갔다.... 응?

이건 머 절반은 낚시지만 어느정도는 사실이였다..

원인은 바로 영수증에 들어가는 환경호르몬 "비스페놀A(BPA)" 때문이였다.

이 비스페놀A는 흔히 우리가 보는 대기표, 영수증 이런 곳에 글자를 찍어내는 데 사용하는 것이라고 한다....

이 비스페놀A에 노출되면 성인병과 어린이 성장발육에 영향을 미치고 , 또 체내에서 호르몬 교란 물질로 작용해 성기능에 문제

를 일으킬 수 있고, 유방암이나 성조숙증과 관련이 있다는 보고도 있단다...... 

거기다가, 이 물질은 입으로나 호흡기로 흡수 되는 것 말고, 손으로 잡고만 있어도 우리 몸에 흡수된다고 하니..... 이거 이제 

영수증도 가급적이면 빨리 확인만 하고 손에서 떼 버려야 겠다.....;;

지금 현재 세계 몇몇의 나라는 사용 금지를 하고 있고, 또 우리 나라도 이 비스페놀A를 사용하기 않아도 되는 영수증을 생산할 

능력을 다 갖추었지만, 그렇게 되면.. 30%의 비용이 증가하기 때문에 눈치만 보고 있는 실정이란다.....

에휴........ 이렇게 위험 물질인 줄 알면서도 돈 때문에 못 바꾸다니......

사람의 건강을 우선 순위로 놓고 생각해야 할텐데..... 언제쯤 이런 걱정에서 해방되서 살 수 있을까?? 
Posted by 바람처럼..
|

 어제 알약 포스팅에 이어서 ...

 계속 검사를 해도 s.spy.onlinegames.ws 가 나오기 시작한다. ;;; 도대체 얘는 뭐지???...

 네이버와 구글링 결과,.. 전형적인 계정탈취용 스파이웨이 라는데... 사실 요즘 게임도 다 접었고, 나는 해당사항이 없어서 좀

안심이기는 하지만... 그래도 다른 인터넷 계정도 마찬가지로 해킹 될 가능성이 있겠지 싶어 불안했다.

어제 ms Security  Essentials 을 깔고 돌렸더니... 어랏.. 치료는 해주는데... imm32.dll 을 지워버렸다. ;;;

이게 지워지면 문제가 뭐냐면 인터넷이나 다른 작업을 할 때 한영키가 안먹힌다 - _- .....

이런.. 키보드 인풋 관련 dll인가 본데.. 이걸 이용해서 후킹 하는 방식 (그렇게 의심할 뿐... ) 으로 계정 정보를 빼가나 보다....

어쩃든 새로운 dll을 다시 다운받고 했는데도....

 저 스파이웨어들이 계속뜬다.... 그래도 다른사람들은 블루스크린에 게임 도중에 팅기고 이런 문제가 있다던데 ...

 나는 다행히 그런 문제는 없다....

 어쨋든 근본적인 해결책은.. 포멧이겠지만... 그래도 그 사람의 인터넷 사용 패턴이 있기 때문에 다시 재 감염되지 않는 다고

장담할 수는 없을 듯하다.. 

 계속 검색해 봣더니 근본적인 문제 해결은 아니지만, 일단 백신을 주기적으로 계속 돌리며, 나와서 걸린 스파이웨어 앞의 + 버

튼을 눌러서 그 파일을 직접 삭제해 버리라는데... 일단은.. 그렇게 버텨봐야겠다... 에효..

 이 지긋지긋한.. 스파이웨어들.!!!!!!!!!!!!!!!!!!
Posted by 바람처럼..
|

이번에 프로젝트를 하면서 키보드 입력 값을 받아서 EditBox 처럼 만들어야 하는 일이 있었다.

처음에 아무 생각없이 그냥 키보드 Input을 처리하듯이 WM_KEYDOWN 메시지를 받아서 처리하려 했었다.

로직을 완성하고 프로그램을 실행 시키는 순간.... 어랏??? ... 그냥 a 라고 생각하고 눌렸는데 A가 나왓다.... 숫자 키는 shift를

눌려도 1, 안눌려도 1이 나왔다.... 흠.... 처음에는 쉬프트에 따른 연산을 따로 해야하는 줄 알았다.

그래서 검색을 해본결과..... 이런..... 키입력을 받으려면.. WM_CHAR를 써야 한다는 것이다.

그냥 WM_KEYDOWN을 쓰면 처음 입력 된 것처럼... 그냥 A, 1 이렇게 나올뿐이고 우리가 흔히 EditBox에 입력되는 형태로 글

자를 출력하려면 WM_CHAR에 들어온 인풋 값을 그대로 배열에 대입해 주면 된다..

간단하지만, 정확히 모르면 헷갈리기 쉬운 메시지.
Posted by 바람처럼..
|


윈도우즈를 메시지 구동 시스템(Message Driven System)이라고 하는데 윈도우즈는 미리 입력된 일련의 명령들을 순서대로

실행하는 것이 아니라 프로그램의 실행 순서가 명확하게 정해져 있지 않으며 상황에 따라 실행 순서가 달라지는데 여기서 말하

는 상황이란 바로 어떤 메시지가 발생했는가를 의미한다.
 
메시지란 사용자나 시스템의 내부적인 동작에 의해 발생된 정보이다. 예를 들면, 마우스 버튼을 클릭했다거나 키보드를 눌렀다

거나 윈도우가 최소화되었다거나 하는 변화에 대한 정보들이 메시지이다.

 윈도우 프로그램에서 메시지를 처리하는 부분을 메시지 루프(Message Loop)라고 하며 보통 WinMain 함수의 끝에 다음과

같은 형식으로 존재한다.

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


위와 같이 메시지 루프는 세 개의 함수 호출로 이루어져 있으며, 전체 루프는 while문으로 싸여져 있어 무한 반복된다.

그럼 각 함수의 역할을 알아보자...

BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);

 이 함수는 메시지 큐에서 메시지를 읽어들인다. 메시지 큐는 시스템이나 사용자로 부터 발생된 메시지가 잠시 대기하는 저장

공간으로 이 함수는 읽어들인 메시지가 프로그램을 종료하라는 WM_QUIT일 경우 FALSE를 리턴하며 그 외의 메시지이면

TRUE를 리턴한다.

BOOL TranslateMessage(CONST MSG *lpMsg);

 이 함수는 키보드 입력 메시지를 가공하여 프로그램에서 쉽게쓸 수 있도록 한다. 어떤 키가 눌러지거나 떨어졌을 때 키보드 메

시지를 발생시키는데 TranslateMessage 함수는 WM_KEYDOWN 메시지가 발생할 때 마다 문자가 입력되었다는 메시지

(WM_CHAR)를 만드는 역할을 한다.

LONG DisPatchMessage(CONST MSG *lpmsg);

이 함수는 메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리 함수(WndProc) 로 전달한다.


메시지 루프의 세 함수는 공통적으로 MSG 라는 구조체를 사용하는데 이 구조체는 다음과 같이 정의되어 있다.

typedef struct tagMSG
{
       HWND         hwnd;
       UINT          message;
       WPARAM    wParam;
       LPARAM     lParam;
       DWORD       time;
       POINT         pt;
} MSG ;

각 멤버의 의미는...

hwnd : 메시지를 받을 윈도우 핸들이다.
message : 어떤 종류의 메시지인가를 나타낸다. 가장 중요한 값이다.
wParam : 전달된 메시지에 대한 부가적인 정보를 가진다. 어떤 의미를 가지는가는 메시지별로 다르다. 32bit 값.
lParam : 전달된 메시지에 대한 부가적인 정보를 가진다. 어떤 의미를 가지는가는 메시지별로 다르다. 32bit 값.
time : 메시지가 발생한 시간이다.
pt : 메시지가 발생했을 때의 마우스 위치이다.

'프로그래밍 > API' 카테고리의 다른 글

[API] DC ( Device Context ) 란..........  (0) 2011.08.03
[API] 커서 바꾸기..  (0) 2011.08.03
[API] 윈도우 생성..  (0) 2011.08.02
[API] 윈도우 클래스  (0) 2011.08.01
[API] 유니코드  (0) 2011.07.31
Posted by 바람처럼..
|
흠.. 역시나 윈도우 프로그램에서 가장 중요한 것은 윈도우다.. 즉, 멀 띄우든지 그 기본이 되는 배경이 있어야 할 것이 아닌가..
윈도우 프로그래밍에서 예전 글에 있는 윈도우 클래스를 참조하여 CreateWindow 함수를 이용 윈도우를 만든다.

HWND CreateWindow(lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hwndParent, hmenu, hinst, lpvParam)

이 것이 Create Window의 함수 원형이다.

lpszClassName : 생성하고자 하는 윈도우의 클래스를 지정하는 문자열이다. CreateWindow 함수는 윈도우 클래스에 정의된 속성되로 윈도우를 생성하는데, 앞서 등록한 WNDCLASS 구조체의 lpszClassName 멤버의 이름을 여기 넣는다.

lpszWindowName : 윈도우 타이틀 바에 나타날 문자열이다.

dwStyle : 만들고자 하는 윈도우의 형태를 지정하는 인수이다. 일종의 비트 필드값이며 수십개의 매크로 상수들이 정의되어 있으니 필요한 형태로 쓰면 된다.

x,y  : 윈도우의 시작 위치를 의미한다.

nWidth,nHeight : 윈도우의 크기를 의미한다. 즉 640x480 이면 x,y 위치에 640x480 크기의 윈도우가 생긴다.

hwndParent : 부모 윈도우가 있을 경우 부모 윈도우의 핸들을 지정한다.

hmenu : 사용할 메뉴의 핸들을 지정한다.

hinst : 프로그램의 핸들을 지정한다. WinMain의 인수로 전달된 hInstance를 대입하면 된다.

lpvParam : 보통은 NULL 값을 넣으므로 일단 무시.

이렇게 윈도우를 만들었으면 화면에 보여야 할 것이다. 화면에 표시하는 함수가..

BOOL ShowWindow(hWnd, nCmdShow )

이다.

hWnd는 화면에 출력하고자하는 윈도우의 핸들이며 createWindow 함수가 리턴한 핸들을 그대로 넘기면되고, nCmdShow는 윈도우를 화면에 출력하는 방법을 지정하는 것인데 다음과 같이 정의되어 있다.

SW_HIDE : 윈도우를 숨긴다.
SW_MINIMIZE : 윈도우를 최소화 하고 활성화 시키지 않는다.
SW_RESTORE : 윈도우를 활성화 시킨다.
SW_SHOW : 윈도우를 활성화하여 보여준다.
SW_SHOWNORMAL : 윈도우를 활성화하여 보여준다.


'프로그래밍 > API' 카테고리의 다른 글

[API] 커서 바꾸기..  (0) 2011.08.03
[API] 메시지 루프  (0) 2011.08.02
[API] 윈도우 클래스  (0) 2011.08.01
[API] 유니코드  (0) 2011.07.31
[API] 핸들에 대한 이해..  (0) 2011.07.31
Posted by 바람처럼..
|
흠.. 지지난주 주말부터니.. 현재 2주동안 알약 문제로 고생을 하고 있다.....

시작은 지지난주 주말... 오랜만에 알약을 확인했더니.. 뜨악? 응 알약이 꺼졌넹?? ; 머.. 일단 다시 실행시켜놓고 인터넷을 하다 또 보니... 어랏?? 또 꺼졌넹?? 

예전에도 이런 경우가 있었는데 이 것은 딱.. 악성코드나 스파이웨어가 설치되었을 때 이런 증상이 나타난다...

그래서 바로.. 안전모드로 부팅을 하고.. 알약을 켰더니.. 휴... 이제 실행이 되는군... 하고 알약으로 정밀 검사를 하고 잠이 든 후 다음날 컴터를 키니 이제 멀쩡하게 실행이 되었다..

그런데 그 후.. 자꾸 2~3일에 한번씩.. 스파이웨어가 실행되는지.. 자꾸 알약이 사라진다 ;; 

그래서 혹시 요근래에 유행하는 스파이 웨어가 있는지 검색을 해 보았다..

머 특별한건 없었다. ;; 그래서 복원을 하고 검사를 하고 복원을 하고 검사를 하고.. 근근히.. 어제까지 버텨왔다...

하지만 오늘 또다시 말썽이다...

하.. 그래서 검색을 해봣다.. 알약이 실행이 안되는 원인이.. 악성코드인지 스파이웨어인지 모른다며, 일단.. 공식 홈피에서 임시 검사 파일을 다운받아서 실행을 해 보란다 - _ -;;
http://alyac.altools.co.kr/Public/Customer/FaqView.aspx?id=1446&subcategory=0&keyword 
이 경로로 들어가면 실행 파일을 받을 수 있다...

그래서 검사해보았다.. 헉.. 역시나 스파이웨어가.. 1개 떡 잡힌다.. 그래서 그걸 잡고 실행했더니.. 으잉? -_ -그래도 알약이 실행이 안된다... 

이걸 어쩌지 고민하다가.. 결국... 

그냥 Microsoft Security Essentials 로 갈아 타기로 맘먹었다 - _ -;;

좀더 알약이 안정화 되면 그때 돌아오던가 해야지.... 에효.. 2주동안 쌩 고생을 해도.. 결국 해결이 안되다니......

ps. 회사에서는 ms Security Essentials를 쓰고 있었는데 얘도 나름 쓸만한 듯하니.. 알약 때문에 고생하시는 분들.. 좀 안정될 때 까지 갈아타시는 것도 괜찮을 것 같네요.
 
Posted by 바람처럼..
|
  


 아.. openCV를 쓰다가.. openCV 캠입력은 윈도우나 하드웨어나 여러가지 특성때문에 가끔 화면 출력이 안되는 경우가 있다.
(화면이 완전 회색이거나 완전 검정)

 그래서 검색을 하고, 하고 또 하다가.. 웹캠을 DirectShow로 출력하라는 글을 보았다.

 그때 부터 바로 서치를 시작했지만.. 필터니, 그래프니.. 이건.. 생전 처음 듣던 용어 들이였다. 물론 좀 더 공부를 해 나가다 보면  익숙해 지겠지만.. 일단은 지금 시간이 없는지라 계속 검색을 하던 중.. 한 클래스를 발견했다. ( 역시 구글~) 

 클래스 작성자가 공개를 해 놓은 것이라.. 써도 될 것 같아서.. 일단 가져와서 쓰고 여기다가도 공유를 해 놓는다.
( 문제가 생긴다면 답글을 달아주시면 바로 삭제하겠습니다. )

 일단 저 클래스를 추가를 하고, main.cpp를 만든 다음에 아래의 예제를 붙이면 된다.

#include <cstdio>
#include "VideoCapture.h"

#define TEST(x) printf("\nPress enter to test: " #x); getchar(); fflush(stdin); x;

void callback(unsigned char* data, int len, int bpp)
{
       printf("DATA %d %d\n",len, bpp);
}

int main()
{
 VideoCapture* vc        = new VideoCapture(callback);

 VideoDevice* devices    = vc->GetDevices();

 int num_devices         = vc->NumDevices();

 for (int i=0; i<num_devices; i++)
 {
  printf("%s\n", devices[i].GetFriendlyName());
 }
 
TEST(vc->Select(devices));
TEST(vc->Start());
 //TEST(vc->Select(devices));
 //TEST(vc->Stop());
 //TEST(vc->Start());
 //TEST(vc->Stop());
 
 printf("Done testing...");

 getchar();
 
 return 0;
}

ps. 물론 dshow가 설치된 경로를 프로젝트에 속성에서 추가를 해주어야 정상적으로 동작을 할 것이다. 
 또 dshow가 컴파일을 하며 내부 .h 에 의한 에러가 난다면 유용한 팁의 다른 글을 참조 하시면 쉽게 해결 될 것이다.

 

 

 

Posted by 바람처럼..
|

 블리자드가 디아블로3 배틀넷에 현금 거래 경매장을 도입, 이용자간 아이템 현금 거래를 가능하게 하겠다는 기사가 떳다... 

기사 링크
원문 기사 보기

이런.. 이제 자체적으로 현금 거래를 도와주다니.. 역시 통큰 블리자드이다. 

예전 디아블로 2를 하며 보낸 학창 시절을 생각해보면.. 정말.. 기대되는 신작이 아닐수 없다. 

그리고 가장 최근까지 와우를 즐겼던 와우져 로써도.. 블리자드 게임의 그 "그래픽이 게임의 다가 아니야.." 라고 느껴지는 모습은 정말 기대감을 한층 높여준다.  


 디아블로3에서는 경매장은 크게 두 가지로 나눠서 게임 머니로 거래가 가능한 금화 경매장과 실제 화폐로 거래할 수 있는 화폐 경매장 방식을 할 예정이란다..

 하지만 한편으로 걱정인 것은 이런 방식이 한국에도 적용될 수 있으려나 모르겠다.

 아이템 현금거래는 내가 알기론.. 청소년 유해매체로 지정되었다고 알고있는데, 물론 디아블로 자체야.. 심의를 받아도 18세가 될 가능성이 농후하지만 그래도, 현거래 시스템이 들어가면 피 색을 바꾼다던지, 조금 에피소드의 폭력성, 잔혹성을 낮춰도

자동 18세가 될 가능성도 있어서 과연 블리자드에서 어떤 결단을 할 지 기대 된다.

어쩃든 이번달이나 다음달쯤 베타 테스트를 하고 올해 중 출시를 목표로 하고 있다고 하니.. 이제 마음을 비우고 기다리는 일만 남은건가??

Posted by 바람처럼..
|
winMain 함수에서 가장 중요한 일은 메인 윈도우를 만드는 일이다. 그러기 위해서는 윈도우 클래스를 먼저 등록한 후 CreateWindow 함수를 호출 해야 한다. 윈도우 클래스는 만들어질 윈도우의 여러 가지 특성을 정의하는 구조체이며 windows.h에 다음과 같이 정의 되어 있다.

typedef struct tagWNDCLASS
{
        UINT                 style;
        WNDPROC         lpfnWndProc;
        int                     cbClsExtra;
        int                     cbWndExtra;
        HINSTANCE       hInstance;
        HICON               hIcon;
        HCURSOR          hCursor;
        HBRUSH            hbrBackground;
        LPCSTR            lpszMenuName;
        LPCSTR            lpszClassName;
} WNDCLASS;


style : 윈도우의 스타일을 정의한다. 즉, 윈도우가 어떤 형태를 가질 거인가를 지정하는 멤버이다.

lpfnWndProc : 이 멤버는 윈도우의 메시지 처리 함수를 지정한다.  메시지가 발생할 때 마다 이 멤버가 지정하는 함수가 호출되며, 이 함수가 모든 메시지를 처리한다. 흔히 말하는 메시지 콜백 함수라고 보면 된다.

cbClsExtra, cbWndExtra  : 일종의 예약 영역이다. 윈도우가 내부적으로 사용하며 특수한 목적에 사용되는 공간이다. 사용하지 않을때는 0으로 지정한다.

hInstance : 이 윈도우 클래스를 등록하는 프로그램의 번호이며, WinMain의 인수로 전될된 hInstance값을 그대로 넣으면된다.

hIcon , hCursor : 이 윈도우가 사용할 마우스 커서와 아이콘을 지정한다.

hbrBackground : 윈도우의 배경 색상을 지정한다.

lpszMenuName : 이 프로그램이 사용할 메뉴를 지정한다.

lpszClassName : 윈도우 클래스의 이름을 문자열로 정의하여서 나중에 CreateWindow 함수에 전달되며, Createwindow 함수는 윈도우 클래스에서 정의한 특성 값을 참조하여 윈도우를 만든다.

'프로그래밍 > API' 카테고리의 다른 글

[API] 메시지 루프  (0) 2011.08.02
[API] 윈도우 생성..  (0) 2011.08.02
[API] 유니코드  (0) 2011.07.31
[API] 핸들에 대한 이해..  (0) 2011.07.31
[API] API 란 무엇인가.  (0) 2011.07.31
Posted by 바람처럼..
|

예전에는 도구의 옵션으로 들어가서 include 폴더 경로와 lib 폴더 경로를 적었었다.

그렇게 되면, 한번 저장된 경로는 모든 프로젝트에 적용 되었으므로, 다음번에 새 프로젝트를 만들더라도 손을 볼 필요가 없었다.

하지만!!! 벗!!! 이제 2010 부터는 각 프로젝트에 속성에 있는 VC++ 경로에 모든 폴더 경로를 지정해야한다........


헤매지 말고 바로 여기서 적으면 된다는 것을 알면 된다.... 하지만... 무지막지하게 귀찮아 진 것이 무엇이냐면.....

이런식으로 프로젝트 속성에서 관리하기 때문에 새 프로젝트를 만들 시 모든 경로를 다시 지정해 줘야한다 ㅠ,ㅠ

물론 좋은 방법이 있을 수 있지만, 현재로는 못 찾아서 그냥 예전 경로를 계속 복사해 줄뿐.......
Posted by 바람처럼..
|

 

 

mfc로 맵툴을 한번 만들어 볼겸 해서 검색을 해 보고 만들면서 방법을 간단히 정리했습니다.
버전은 VS 2010 기준입니다.  ( 2008도 됩니다. 예전에 2008을 쓰다가 현재는 2010을 쓰고 있습니다.  )
먼저 mfc 기본 프로젝트를 생성합니다.

일단 다음을 누르고 넘어간 다음 유니코드 라이브러리를 체크 하시고 단일 문서를 체크 후 다음다음을 합니다.
 아래 사진은 Visual Studio 스타일로 되어있는데 MFC 표준으로 바꿔줍니다.


그리고 사용자 인터페이스 기능에서 분할 창을 체크 하시구요


그리고 마침을 누릅니다. 그 후에 프로젝트에 가서 클래스 추가를 누릅니다. 그럼 이런창이 하나 뜰텐데요


mfc 클래스 추가를 누르시고 아래와 같이 클래스를 추가합니다. ( 이 것은 아까 분할창을 사용하기 위한 클래스 입니다. )

 


그렇게 하시면 Controlview 라는 클래스가 생성될 것입니다. 그럼 MainFrm.cpp로 가셔서 이렇게 추가를 해주시구요

#include "maptoolDoc.h"
#include "maptoolView.h"
#include "ControlView.h"


이제 CMainFrame::OnCreateClient() 함수를 찾아가서 아래와 같이 바꿔 줍니다.

 //return m_wndSplitter.Create(this,
 // 2, 2,               // TODO: 행 및 열의 개수를 조정합니다.
 // CSize(10, 10),      // TODO: 최소 창 크기를 조정합니다.
 // pContext);

예전에 있떤 부분을 주석 처리 하시고,

 if( !m_wndSplitter.CreateStatic( this, 1, 2 ) )
 {
  return FALSE ;
 }

 if( !m_wndSplitter.CreateView( 0, 0 ,
  RUNTIME_CLASS(CmaptoolView), CSize(768,768), pContext ) )
 {
  return FALSE ;
 }

 if( !m_wndSplitter.CreateView( 0, 1 ,
  RUNTIME_CLASS(CControlView), CSize(1280-768,768), pContext ) )
 {
  return FALSE ;
 }

 return TRUE ;

이렇게 바꾸어 줍니다.

그 다음에 바로 아래에 있는 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 함수는...

 cs.x = 100 ;
 cs.y = 100 ;
 cs.cx = 1024 ;
 cs.cy = 768 ;

 cs.style &= ~FWS_ADDTOTITLE ;
 LPCTSTR TitleName = _T("mapTool") ;
 SetTitle(TitleName) ;


 을 추가해 줍니다.

그렇게 한 후 리소스 뷰에서 dialog를 보면 CONTROLVIEW가 추가되어 있을 것입니다.

이 것을 적당한 사이즈로 만드시고 컴파일을 하시면..


짜잔~ 이렇게 창이 생깁니다. 하지만 지금 이 상태는 가운데 분할 바가.. 계속 움직입니다. 그것을 방지하기 위한 클래스가 필요합니다. 

MainFrame.h 의 class 위에 아래 부분을 추가해 줍니다.

class CSplitterX : public CSplitterWnd
{
public:
 CSplitterX() ;
 ~CSplitterX() ;

protected:
 afx_msg UINT OnNcHitTest(CPoint point) ;
 DECLARE_MESSAGE_MAP() ;
};


그리고 CMainFrame 클래스 내부의 protected: 의 CSplitterWnd m_wndSplitter; 대신
CSplitterX m_wndSplitter ; 를 넣어 줍니다.

그리고 다시 cpp로 돌아가서 제일 윗 부분에

BEGIN_MESSAGE_MAP(CSplitterX, CSplitterWnd)
 ON_WM_NCHITTEST()
END_MESSAGE_MAP()

CSplitterX::CSplitterX() {}
CSplitterX::~CSplitterX() {}

UINT CSplitterX::OnNcHitTest(CPoint point)
{
 return HTNOWHERE;
}


을 넣어 줍니다. 그리고 컴파일을 하면..... 어라....

error C2440: 'static_cast' : 'UINT (__thiscall CSplitterX::* )(CPoint)'에서 'LRESULT (__thiscall CWnd::* )(CPoint)'(으)로 변환할 수 없습니다.

이런 에러가 발생합니다. 참고했던 페이지의 방법이 2003 버전이라 방식이 좀 바뀌었습니다. 그래서 위의 msg를 조금 손을 봐야 합니다. 헤더에 추가했던
protected:
afx_msg UINT OnNcHitTest(CPoint point) ;

부분을

protected:
afx_msg LRESULT OnNcHitTest(CPoint point) ;

로 바꿔주고, cpp도 마찬가지로~

UINT CSplitterX::OnNcHitTest(CPoint point)
{
return HTNOWHERE;
}
이 부분을

LRESULT CSplitterX::OnNcHitTest(CPoint point)
{
 return HTNOWHERE;
}

이렇게 바꿔주면...

 
이젠 움직이지 않는 윈도우 완성!!!!!

이제 여기다가 추가적인 작업만 하면, 멋진 툴이 될 수 있겠죠 !

다들 즐프~

Posted by 바람처럼..
|

아래 주소로 가시면 자세한 설명이 나와있습니다.
신청하고 디아3의 세계로~~~

http://iamdog.kr/62
Posted by 바람처럼..
|

오늘 신도인지 산도인지 하는 일본 국회의원이 한국 들어왓다고.. 공항이 떠들썩 하다..

머 지발로 수교를 맺은 국가에 발 디디는 거야.. 그렇다 치더라도.... 아직도.. 독도는 자기땅이라는 주장을 하다니 정말 기가 막히고 코가 막힌다...

 도대체 이건 머 논리의 정당성이라도 있으면, 이해라도 하지만.. 그냥 막무가네다....

 언제까지 독도를 붙잡고 쌩떼를 쓸 것인가... 그래놓고.. 오늘 라디오인지 방송 대담에서는 독도는 국제법상 또 자기꺼라면서 센카쿠는 또 자기꺼라네.. ㅋㅋ 무조껀 다 자기꺼라 그러면.. 되는 것인 줄 아나보다..

물론 국회의원씩이나 되는 사람이 방송에 나와서 사정 좀 바달라고 못하는 건 알지만.. 그렇다고 이런식으로 나오는 건 지가 자국민의 이익을 위해 행동 하듯이 우리나라에서 우리나라의 이익을 위해 행동하는 건 또 못보겠다니..

또 알아서 정중하게 돌아가 달라고 했으면, 그냥 유감이네 이러고 돌아가면 그 뿐인데 또 버티고 있다니..

이건 머 우리나라를 자기들 보다 아래로 보지 않고서는 도저히 이딴 행동은 할 수가 없다..

이젠 우리 나라의 힘을 일본에 보여 줄 때이다.....

ps. 머 어차피 쓰나미 몰려와서 돈이라도 보내줄까 생각하다가 우리 나라 불우이웃 돕기에 내버렸지만.. 정말 잘했다는 생각이 든다... 난 아직도 일본 따윌 정으로 돕고, 북한 주민을 인정으로 돕는 다는 사람들은.. 이해가 안된다.. 그 전에 우리나라 몇만 몇십만의 불우이웃 문제부터 먼저 해결하고 남의 나라를 도우시길.....
Posted by 바람처럼..
|


웹캠의 영상을 입력 받기 위해서 dsshow 헤더를 인클루드 시켰다..

예전에는 dx 8.0x 버전까지만 나오고 이후 버전에 없었기 때문에 예전 버전을 썻지만 요즘에는 WPF에 함께 설치가 되어 확실히 간편해 졌다.

하지만

#include <dshow.h> 와
#include <qedit.h>

헤더를 인클루드 시키고, lib 파일을 추가한 다음에 컴파일을 했더니

fatal error C1083: 포함 파일을 열 수 없습니다. 'dxtrans.h': No such file or directory

이런 에러가 떳다..... 응? ... 내부적인 에러였다.. 머 검색을 좀 하다보니 최신 버전으로 바뀌며 먼가 안맞아 져서 수정을 해야한다는데......

결국 해결책을 찾았다.

해결책은

#include <dshow.h> 와
#include <qedit.h> 사이에

#pragma include_alias( "dxtrans.h", "qedit.h" )
 
#define __IDxtCompositor_INTERFACE_DEFINED__
 
#define __IDxtAlphaSetter_INTERFACE_DEFINED__
 
#define __IDxtJpeg_INTERFACE_DEFINED__
 
#define __IDxtKey_INTERFACE_DEFINED__

이 부분을 추가해주면 끝.

Posted by 바람처럼..
|


 얼마전 VS 2008로 만든 릴리즈 버전 프로그램을 배포 하려 했는데 문제가 있었다.

 되는 컴퓨터가 있고, 안되는 컴퓨터가 있는 것이다.

 그래서 그냥 필요하다는 dll을 모두 릴리즈 폴더안에 넣어 두었다.

 하지만 그렇게 하더라도, 시작점을 제대로 초기화 하지 못했다면서 죽어 버리는 문제가 발생하였다. 

 이것의 원인이 무엇인가 하고 계속 검색을 해보니.. 2003 이후부터 (2005인지 2008인지 모르지만 일단 넘어감) dll을 링크할 시에

widows폴더에 winSxS 라는 폴더에 각 버전에 맞는 dll을 링크 하도록 바뀌었다고 한다 ..

 즉 예전에는, 그냥 컴파일 했던 컴퓨터의 dll을 폴더에 넣어만 줘도 해결 되던 문제들이 이제는 안되는 것이다.

 그래서 생각한 첫번째 해결책은 재배포 패키지를 설치하는 것이다. (각 버전에 맞는 패키지 들은 마이크로소프트 다운로드 센터에서 받을 수 있다.)

 하지만.. 그렇게 설치를 했지만 문제가 생겼다.. 여전히 같은 증상인 것이다. 참고로 나는 2008로 컴파일을 했기 때문에 2008 기본 재배포와 sp1 재배포를 설치했었다.

 그래서 또 알아보니, 여기에 링크되고 있던 라이브러리 중 하나가 예전 버전 dll을 이용하고 있었던 것이다.

 그래서 이전 버전 재배포 까지 깔고 나서야... 겨우 문제가 해결되었다.

 하지만, 또 한가지 문제가 있었으니... xp용 컴퓨터에서는 잘 동작하는데.. 윈도우 7에서는 먹통이 되는 것이였다.. 분명히 재배포도 깔고 다 깔았는데 why? 라고 생각했지만, 이것도 사실 간단한 문제였었다.

 윈도우 7은 다이렉트 11을 기본적으로 설치해 놓고 있는데.. 프로그램을 개발할 때 썻던 버전은 다이렉트9 였던 것이다. 그래서 다이렉트 9 버전의 런타임 라이브러리를 설치했더니 7에서도 문제 없이 돌아갔다.

 사실 알고 보면 참 원인은 간단한데.. 모를 땐 답답하니... 이렇게 정리를..

 ps. 한가지 해결책이 더 있는데 그것은 매니페스트 파일(2008인지 2005부터 생김)을 직접 손을 봐서 해결 하는 방법이다. 

 - 윗 부분 생략 -

<dependency>

    <dependentAssembly>

<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

    </dependentAssembly>

  </dependency>

</assembly>

 

위의 설정을 보면 Microsoft.VC90.CRT 관련하여 9.0.30729.1 버전의 32bit dll을 링크한다는 의미이다.  현재

publicKeyToken
에 대해서 없어야 된다는 의견도 있으나, 저것이 있어도 실행되는 컴퓨터에서는 전혀 이상없이 동

작하기 때문에 조금 더 옵션에 대해 알아봐야 할 것 같다.


ps. 아 또 한가지 해결책이 있는데 컴파일 옵션을 dll을 애초에 컴파일 하면서 포함하도록 하면, 용량은 좀 늘어나지만, 배포하

기는 훨씬 수월해진다. 하지만, 이 것은 미리 컴파일 된 해더와 서로 충돌이 있어, 이 문제를 해결 하고 사용해야 할 것이다.



Posted by 바람처럼..
|
유니코드는 16비트의 단일한 값으로 지구상의 모든 문자를 표현할 수 있는 문자 코드 체계이다.
유니코드를 지원하려면 문자형이나 문자열에 대해 C언어의 타입을 바로 쓰지 말고 유니코드 설정에 다라 변경되는 중간 타입을 써야한다.

char -> TCHAR
char* -> LPSTR
const char* -> LPCTSTR

로 쓰면 된다.

TCHAR는 C의 기본 타입 중 하나인 char와 일단 같지만 유니코드로 컴파일 할 때는 wchar_t 타입이 된다. TCHAR 타입의 실제 정의문은 다음과 같이 조건부 컴파일문으로 작성되어 있다.

#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

 이렇게 작성되어 있기 때문에 char를 바로쓴 소스는 유니코드로 바꿀 때 일일이 소스를 뜯어 고친 후 다시 컴파일해야 하지만 TCHAR라는 중간 타입을 사용하면 프로젝트 설정에 따라 자동으로 변환해 주므로 가급적 char* 보다는 LPSTR 또는 TCHAR*를 쓰는 것이 현명하다.

유니코드용 문자열 함수는 기본 함수에 l을 붙여주면 된다.

strlen -> lstrlen
strcpy -> lstrcpy
strcat -> lstrcah
strcmp -> lstrcmp
sprintf -> wsprintf

'프로그래밍 > API' 카테고리의 다른 글

[API] 윈도우 생성..  (0) 2011.08.02
[API] 윈도우 클래스  (0) 2011.08.01
[API] 핸들에 대한 이해..  (0) 2011.07.31
[API] API 란 무엇인가.  (0) 2011.07.31
[API] API 관련하여..  (0) 2011.07.31
Posted by 바람처럼..
|

 핸들(handle)이란 어떤 대상에 붙여진 번호이며 문법적으로는 32bit 또는 64bit의 정수 값이다.
윈도우즈 에서는 여러가지 종류의 핸들이 사용되고 있는데 만들어진 위도우에는 윈도우 핸들(hWnd)를 붙여 번호로 관리하고 DC(device context)에 대해서도 핸들을 사용하고 펜, 브러시 에도 핸들을 붙여 관리한다.

왜 이렇게 관리를 하냐고 한다면, 대상끼리의 구분을 위해서 이기도 하지만 문자열보다는 정수를 사용하는 것이 속도가 훨씬 더 빠르고 간편하기 때문이다. 윈도우에서는 핸들을 많이 사용하므로, 핸들의 특성에 관해 미리 숙지하는 것이 좋다.

1. 핸들은 정수값이며 대부분의 경우 32비트 값이다. 핸들을 사용하는 목적은 구분을 위한 것이므로, 핸들끼리 중복되지 않아야 하며 이런 목적으로는 정수형이 가장 적합하다. 정수형은 비교나 대입 연산이 가장 빨라서 핸들로 쓰기 적합하다.

2. 같은 종류의 핸들기리는 절대로 중복된 값을 가지지 않는다. 만약 이렇게 된다면 대상을 구분하는 본래의 목적을 달성할 수 없을 것이다. 물론 다른 종류의 핸들 끼리는 중복된 값을 가질 수도 있다.

4. 핸들은 정수형이므로 값을 가지겠지만, 그 실제값이 무엇인지는 몰라도 상관없다. 핸들은 크고 작음의 성질을 가지는 숫자가 아니라 단순한 표식일 뿐이다. 핸들형 변수를 만들어 핸들에 대입받아 쓰고 난 후에는 버리면 된다.

'프로그래밍 > API' 카테고리의 다른 글

[API] 윈도우 생성..  (0) 2011.08.02
[API] 윈도우 클래스  (0) 2011.08.01
[API] 유니코드  (0) 2011.07.31
[API] API 란 무엇인가.  (0) 2011.07.31
[API] API 관련하여..  (0) 2011.07.31
Posted by 바람처럼..
|

일단 먼저 시작하기에 앞서. API란 무엇인가에 대하여 생각해 볼 필요가 있다.

API란 Application Programming Interface의 약자이며 운영체제가 제공하는 함수의 집합이라고 보면 된다 .

쉽게 설명하면 프로그램 개발자들이 운영체제의 복잡한 내부 동작까지 이해하고 있기는 쉽지 않으므로, 운영체제에서 기본적인 동작을 하는 함수의 집합을 말한다고 보면된다. 

또 API라는 의미는 운영체제의 함수 집합이므로 정확히 따지면 윈도우즈 API라고 해야하지만 요즘 대부분 API라고 하면 윈도우즈 API라고 생각하기 때문에 생략하는 경우가 많다.

 또 흔히 처음 프로그래밍을 접하는 사람들은 보면, 뭐 부터 배워야 하나요 이러면서 c, c++, api, mfc 이런식으로 순서를 정하는 경우가 많은데... 잘 생각해보면 다 독립적이 아니라 하나의 큰 집합의 부분집합 들일 뿐이다.

c의 문법은 거의 대부분 c++에 적용된다. c++은 c에 비하여 객체지향적 요소가 더해진 말하자면 ++, 확장형이다.

api는 이런 문법을 기반으로 윈도우 프로그래밍을 도와주는 함수 집합일 뿐이고, MFC는 Microsoft
Foundation Class의 약자로, 저런 api들이나 제공 클래스들을 하나 묶어서 쓰기 쉽게 만든 형태라고 보면 거의 맞다. (엄밀히 따지자면 아닌 부분도 있지만, 처음 이해할 때는 그런 식으로 하는 것이 쉽다는 의미)

 즉, 배워나가는 순서보다는, C와 C++의 문법의 이해가 선행되면, api나 mfc는 하나의 방법들 이므로 응용해서 사용하기만 하면 충분하다.

'프로그래밍 > API' 카테고리의 다른 글

[API] 윈도우 생성..  (0) 2011.08.02
[API] 윈도우 클래스  (0) 2011.08.01
[API] 유니코드  (0) 2011.07.31
[API] 핸들에 대한 이해..  (0) 2011.07.31
[API] API 관련하여..  (0) 2011.07.31
Posted by 바람처럼..
|

솔직히 말하자면.. 이해가 안된다..

저 사람들의 정체는 도대체 무엇일까?? 물론 한진중공업 사태에 대해서는 나도 회사 측의 부당한 해고라고 생각한다.

하지만 어쩌겠는가.. 얼마전에 누군가의 글을 보았다. 회사가 마음대로 자르지도 못한다면 그 것은 말 그대로 뽑은 사람은 계속 써야 한다는 말인데.. 그 것은 반대로 회사의 입장에서는 부당하다고 하지 않을까??

그럼 또 누군가는 말을 하겠지.. 니가 그 꼴 안당할 것 같냐고.. 맞는 말이다. 하지만 내가 해고 되었다고 해도 상황을 이해해야 한다면, 나만 좋자고 몇십, 몇백의 사람들을 힘들게 한다면 받아 들이고 새로운 직장을 알아보든 할 것이다..

약간 옆길로 샜는데.. 내가 이해가 안된다는 부분은.. 우리 나라는 민주주의 국가이고 자신의 믿는 바가 그렇다면 모이고, 얘기하고 말할 자유는 있다. (물론 국가 전복 세력의 의견은 아니지만.)

하지만 그렇다고 해서 남의 자유마저 짓밟으며, 자신의 의지를 관철 시키는 것은 범죄이다. 내가 이렇게 화가 난 이유와 그 들의 행동이 이해가 되지 않는 것은, 자신의 목적을 위하여 남의 불편쯤은 감수하라는 이기주의 때문이다.

나는 엄밀히 말하면 지금은 부산사람은 아니다. 하지만 어렸을 적 부터 외가가 있어 자주 왕래하였고, 대학 때문에 6년정도 부산에서 살았으며, 현재도 친구들 때문에 또 여자친구 때문에 한달에 2~3번을 갈만큼 부산과 밀접한 관계가 있다고 생각한다.

 또 내 여자친구는 영도에 살고 있다. 그러면서 이번 사태에 대해 정말 직,간접적으로 영향을 봤다. 2차 희망버스일 때 이야기이다. 원래는 여자친구가 내가 현재 있는 대구로 오려 했지만, 영도에서 나오는 길이 버스가 다 통제당하고 돌아 감으로 해서 1시간이 넘게 걸리겠다 하여 내가 내려갔다. 고작, 몇km 나오는데 1시간이라니..

원인은 영도가 섬이라는 특수성 때문이다. 나올 수 있는 대교는 3군데 이지만 시내로 가장 빨리 나오는 곳이 2곳이라고 보면 된다. 하지만 그 한곳을 지나 바로 왼쪽편에, 한진중공업이 자리잡고 있는데 이번 시위대가 그 자리를 막는 바람에 30분이면 나올 거리를 2배~3배로 돌아 나와야 하는, 그 것도 희망버스 참가자들의 사정에 의한 주말 집회로 인하여 라면.. 그 행동들은.. 과연 사람들에게 이해 받을 수 있을까??

1차 때는 솔직히 소동이였다면, 2차 때는 그 것의 절정이라, 이제는 안올 줄 알았다. 그만하면 한진중공업을 모르던 사람들도 대부분 다 알았고, 소기의 목적이 부당 해고를 알리는 것이였다면 그 것은 충분히 성공했다.

하지만 이번 3차를 보며 이제는 두렵기도 하다. 과연 이사람들의 진의는 무엇인가.. 이번 3차로 인하여 더욱 궁금하다. 도대체 그 문화제의 앞줄에 앉은 정치인들은 다 무엇이란 말이가?? 이것은 노동계 집회인지 정치계 집회인지 그 여부조차 불명확하다..

 글이 길어 졌는데 이제 결론을 내려야 겠다.. 글 서두의 그 희망버스 사람들의 정체는 아마 우리의 친구, 형제, 부모, 혹은 이 땅의 발전을 위하는 한명 한명의 소중한 우리 국민일 것이다. 하지만 그 한명 한명이 모여 집단이 되고 그 집단의 이기심 때문에 그 개인의 좋은 취지가 무색해 진다면.. 과연 그 사람들이 나중에 지나서 진정 자신의 행동에 자랑스러워할 수 있을지 의문이다.

 ps. 한명 한명의 우리 국민님들께는 수고는 하셧지만 방법을 바꿨으면 좋겠다는 바램을 드리며, 그 외 집회를 선동하고 국가의 전복을 꾀하는 일부 지도자들은.. 제발.. 국민들은 위한다면서 국민을 총알받이로 앞세우지 말기를 바란다. 언젠가.. 너희 세력들은 국민의 손에 심판 당할 날이 올 것이다.

아 또.. 이런 내 의견이 있지만 차마 인터넷 기사에는 댓글도 못달겠다. 이건 무슨 이쪽의견쓰면 알바니, 저쪽 의견쓰면 빨갱이니.. 좌빨이니.. 남의 의견에도 존중을 보낼 줄 아는.. 그런 선진문화가 빨리 되었으면 좋겠다.......
Posted by 바람처럼..
|

API 관련 카테고리에서는 유명한 책인

한빛미디어에서 나온 API 정복이란 책의 내용을 정리하겠습니다.

그렇다고 무턱대고 책의 내용을 배껴오는 것이 아니라 간단한 예제를 수록하는 정도로

정리할 예정입니다.  

'프로그래밍 > API' 카테고리의 다른 글

[API] 윈도우 생성..  (0) 2011.08.02
[API] 윈도우 클래스  (0) 2011.08.01
[API] 유니코드  (0) 2011.07.31
[API] 핸들에 대한 이해..  (0) 2011.07.31
[API] API 란 무엇인가.  (0) 2011.07.31
Posted by 바람처럼..
|

앞으로 일상 생활의 기록과

간단한 프로그래밍에 대한 정보, 혹은 잊기 쉬운 유용한 팁을 기록하기 위하여,

블로그를 시작하려 합니다.

정보 공유를 위함도 있으니 앞으로 많이 들러주시면 감사하겠습니다.

Posted by 바람처럼..
|