'윈도우프로그래밍'에 해당되는 글 3건

  1. 2008.04.14 [MFC] 트레이아이콘 만들기
  2. 2008.04.05 투명한 윈도우
  3. 2008.03.21 윈도우 프로그램에서 프록시 사용
1.트레이아이콘 생성을  위한 준비

(1)트레이아이콘의 행위를 정의하기위한 사용자 정의 메시지만들기

-사용자 정의 메시지 id 부여
    ex) #define  UM_TRAYICON WM_USER + 1

생성방법:트레이아이콘의 메시지를 받을 윈도우에 멤버함수로 사용자정의메시지수신시 호출될 함수 정의

-함수의 정의내용 - 트레이아이콘에 대해서 어떤 버튼을 눌렀을 때 무슨 일을 하게 할 것인가를 정의하는 것이다.

ex)
LONG CCTrayIconTestDlg::TrayIconMessage(WPARAM wParam,LPARAM lParam)
{
    if(lParam == WM_LBUTTONDOWN) //트레이아이콘을 한 번클릭시
    {
        //메뉴를 로드한다.
        CMenu menu, *pMenu;
        CPoint pt;

        menu.LoadMenu(IDR_MENU1);
        pMenu = menu.GetSubMenu(0);//첫번째 주메뉴를 호출한다.
        GetCursorPos(&pt);
        pMenu->TrackPopupMenu(TPM_RIGHTALIGN,pt.x,pt.y,this); //트레이아이콘의 메뉴를 X,Y위치에 뛰운다.
    }

    //트레이 아이콘을 더블클릭했을때 윈도우가 보여지게 한다.
    if(lParam == WM_LBUTTONDBLCLK)
    {
        ShowWindow(SW_SHOW); //윈도우를 보여준다.
    }

-메시지루프에 등록
    ON_MESSAGE(UM_TRAYICON,TrayIconMessage)

 
(2)트레이 아이콘이 사용할 메뉴만들기

-메인메뉴를 그대로 사용한다면 상관없지만 ,메인메뉴가 없는 프로그램이라면 리소스에서 메뉴를 만들고 각각의 메뉴에 대해서 이벤트를 생성하자.

(3)트레이아이콘 리소스 만들기

-트레이아이콘 리소스를 만들고 그에 대한 컨트롤 아이디값을 부여하자.
    ex)IDI_TRAY와 같이


2.트레이아이콘 생성하기

(1)생성위치

-프로그램 초기화시가 적당하다.

(2)생성방법

NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = m_hWnd;    //트레이아이콘과 통신할 윈도우 핸들
nid.uID = IDI_TRAY;   //트레이아이콘의 리소스ID(Data측면)
nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uCallbackMessage = UM_TRAYICON; //트레이아이콘의 메시지가 수신시 수신윈도우가 처리할 메시지
nid.hIcon = AfxGetApp()->LoadIcon(IDI_TRAY);//아이콘리소스(UI측면)
lstrcpy(nid.szTip,"트레이아이콘"); // 툴팁
// taskBar상태영역에 아이콘 추가,삭제,수정할때 시스템에 메시지 전달
Shell_NotifyIcon(NIM_ADD,&nid); //구조체내용으로 트레이아이콘을 등록한다.(Data측면)

SendMessage(WM_SETICON,(WPARAM)TRUE,(LPARAM)nid.hIcon);//트레이화면에 붙이기(UI측면)

 
3.생성후 고려사항

(1)메시지처리

메시지처리는 트레이아이콘과 연결된 윈도우가 수신시 TrayIconMessage가 호출되어 LPARM으로 전달된 트레이 아이콘의 행위에 따른 동작을 실시하면 된다.

 
(2) X버튼 클릭시

X버튼 클릭시 프로그램을 닫아버리면 트레이아이콘을 사용하는프로그램으로서의 가치가 없다.
따라서 다음과 같이 처리하는 것이 정석이다.

void CCTrayIconTestDlg::OnClose()
{
    // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
    ShowWindow(SW_HIDE);//트레이아이콘으로만 표시되게한다.
    //CDialog::OnClose(); //WM_CLOSE의 자동생성코드인 이 부분을 주석처리한다.
}
 

(3)종료처리

-우선 트레이아이콘메뉴에 종료처리메뉴를 둔다

-WM_DESTORY메시지처리부분은 다음과 같이 처리한다.


void CCTrayIconTestDlg::OnDestroy()
{
    CDialog::OnDestroy();

    //리소스 해제
    NOTIFYICONDATA nid;
    nid.cbSize = sizeof(nid);
    nid.hWnd = m_hWnd;
    nid.uID = IDR_MENU1;

    Shell_NotifyIcon(NIM_DELETE,&nid);//삭제플래그를 준다.
}

-종료처리메뉴 클릭시 WM_DESTORY메시지를 호출되도록 PostQuitMessage(0);을 호출한다.

//(4)프로그램 종료후에도 트레이아이콘의 잔상이 남는 경우의 처리

//메인의 소멸자부분에서

//AfxGetApp()->LoadIcon(IDI_TRAY);/

[출처] [MFC]트레이아이콘 만들기|작성자 붉은바다
Posted by 배트
,
다이얼로그 기반의 투명한 윈도우는 세련되고 구현이 쉽다.
간단한 생활 어플리케이션은 이 기능으로 예쁘게 만들 수 있다.

1. 윈도우 스타일에 WS_EX_LAYERED를 추가

2. 투명도 설정

SetWindowLong(hwnd, GWL_EXSTYLE,GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes( 0, (255 * 30) / 100, LWA_ALPHA );

MFC8 에서는 SetLayeredWindowAttributes가 기본으로 include, link되지만
VC6 에선 user32.dll에서 직접 로드해야하고, 함수 기본형도 다르다.
VC6 에서는 아래와 같이 한다.

// 함수 선언
BOOL SetLayeredWindowAttributes(
    HWND hwnd,           // handle to the layered window
    COLORREF crKey,      // specifies the color key
    BYTE bAlpha,         // value for the blend function
    DWORD dwFlags        // action
);

// 상수 선언
#define WS_EX_LAYERED 0x00080000
#define LWA_ALPHA     0x00000002

// DLL에서 함수를 호출하기 위한 함수 선언
typedef BOOL(WINAPI *SLWA)(HWND, COLORREF, BYTE, DWORD);

// 함수포인터 선언
SLWA pSetLayeredWindowAttributes = NULL;

// DLL을 로드하여 함수에 대한 포인터를 가져옴
HINSTANCE hmodUSER32 = LoadLibrary("USER32.DLL");
pSetLayeredWindowAttributes =
(SLWA)GetProcAddress(hmodUSER32,"SetLayeredWindowAttributes");

HWND hwnd = this->m_hWnd; //다이얼로그의 핸들
// 다이알로그의 스타일 변경
SetWindowLong(hwnd, GWL_EXSTYLE,GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
// 다이알로그의 투명도를 30%로 변경
pSetLayeredWindowAttributes(hwnd, 0, (255 * 30) / 100, LWA_ALPHA);

[출처] [MFC] 투명한 다이알로그 |작성자 견우


이렇게 하면 ㅇㅋ
Posted by 배트
,
1. WinInet을 사용하는 경우
    InternetOpen에서 설정한다.
    OS(즉, Internet Explorer)에 설정된 프록시 설정을 그대로 사용할 수 있고.
    프로그램에서 독자적으로 프록시 설정을 할 수도 있다.

2. WinHTTP를 사용하는 경우
    SetProxy 메소드를 통해서 프록시 설정을 할 수 있다.
    WinInet과 마찬가지로 시스템 설정, 사용자 설정 둘 다 가능하다.

3. Internet Explorer 컨트롤을 사용하는 경우
    Proxy 설정을 별도로 하는 메소드나 방법을 찾지 못했다.
    시스템 설정만을 따르는 것 같다.

※ 시스템의 프록시 설정을 변경하는 방법
    1. Internet Explorer의 옵션에서 변경
    2. 레지스트리의 키를 수정 직접 수정
       Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer
       Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable
       실행 중인 어플리케이션에 적용하기 위해선 아래 함수 콜이 필요하다.
       InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
       InternetSetOption(NULL, INTERNET_OPTION_REFRESH, NULL, 0);
    3. WMI의 SetProxySetting API를 이용
       아마 레지스트리의 키를 직접 변경하는 것과 다를 바가 없을 듯

결론
Internet Explorer ActiveX를 사용하는 어플리케이션은
동시에 여러 어플리케이션을 실행하면서
각각 다른 프록시 설정을 하는 것이 어렵다.
다른 편법을 동원해야 할 듯 하다.

ps. 특정 어플리케이션에 강제로 프록시 세팅을 해주는 유틸리티를 본 것 같다.
     하지만 지금은 찾을 수도, 어떻게 동작하는 지도 모르겠다.
     프록시 서버 리스트, 자동으로 구성 같은 내용도 알아봐야 한다.


프록시 설정 자세히


[ 레지스트리 경로 ]
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings

[ 프록시 서버 사용(X) ]
    종류 : REG_DWORD
    ProxyEnable => 0x00000000(0) => 사용안할때
    ProxyEnable => 0x00000001(1) => 사용할때

[ 로컬 주소에 프록시 서버 사용 안함(B) ]
    종류 : REG_SZ
    ProxyOverride => <local> => 체크시 레지스트리에 생성됨
    비체크시에는 레지스트리에서 이름과 값이없어짐.
   
[ 프록시 서버명과 포트번호 ]
    종류 : REG_SZ
    ProxyServer => http=localhost:8000

인터넷 옵션에서 고급탭 설정 방법.
[ HTTP 1.1 설정 ]
         종류 : REG_DWORD
    프록시 연결을 통해 HTTP 1.1 사용
    ProxyHttp1.1 => 0x00000001(1) => 사용할때
    ProxyHttp1.1 => 0x00000000(0) => 사용안할때

    HTTP 1.1 사용
    EnableHttp1_1 => 0x00000001(1) => 사용할때
    EnableHttp1_1 => 0x00000000(0) => 사용안할때

출처 : 데비피아 C++ Q&A
Posted by 배트
,