GSI

사용자 삽입 이미지

Win32 대화 상자와 Windows 폼이 다른 점은 폼이 자동으로 사용자가 Enter, Esc 키가 눌렀을때 키보드 입력을 라우팅 하지 않는 다는데 있다. MFC와 같은 Win32 작업을 할때는 폼을 하나 생성하게 되면 Ok, Cancel 버튼이 생성되게 된다.
하지만 Windows 폼의 경우는 아무것도 생성되지 않는 윈도우만 생성된다.
이때 폼에 OK, Cancel 버튼을 넣어 주고 싶다면, 어떻게 해야 하는가?
이때 위의 이미지에 나오듯이 해당 버튼을 만들고 DialogResult의 속성을 정의해 주면 된다. 더 펀한듯 보인다.
Posted by gsi
:

C#, .NET 의 미리 정의된 타입 비교

C# 프로그램을 하다 보면 int 또는 Int32 라는걸 사용해서 타입을 정해줄 때가 있다.
처음에는 int 형이 있는데 Int32, Int64, int16 과 같은 걸 볼 수 있다.
지금 생각 해보면 int 는 C# 의 미리 정의된 타입이고, Int32 와 같이 int가 대문자 Int로
되는 것은 System을 네임스페이스로 가지는 .Net 의 미리 정의된 타입인거 같다.

몇가지 예)

bool

System.Boolean

True 인지 false 인지 나타내는 논리 값

기본값은 false 이다.

byte

System.Byte

0 부터 255 까지의 값을 저장하는 부호 없는 바이트, 기본값은 0 이다.

sbyte

System.SByte

-128 ~ 127 까지 저장하는 바이트, 기본값은 0이다.

char

System.Char

부호없는 16비트 유니코드 문자, 기본값은 ‘\0’ 이다.

decimal

System.Decimal

128 비트 데이터 형식, 재무 및 통화 계산에 적합하다. 기본값은 0.0m 이다.

double

System.Double

64비트 부동 소수점, 기본값은 0.0d 이다.

float

System.Single

32비트 부동 소수점, 기본값은 0.0f 이다.

int

System.Int32

부호 있는 32비트 정수 타입, 기본값은 0 이다.

uint

System.UInt32

부로 없는 32비트 정수 타입, 기본값은 0이다.

나머지는.. -.- 귀찮네욤. ^^

여기서 중요한건 C#으로 개발하는 사람은 C#의 타입을 사용해서 프로그램을 작성하는게
보다 명확하며, 다른 언어를 사용하는 컴포넌트 개발자와 함께 작업하는 경우에는
언어 사이의 타입을 일치시키기 위해서 반드시 위의 표와 같은 타입을 알고 있어야 한다.
Posted by gsi
:

Win Form Flicker Free

더블 버퍼링 옵션이 따로 있기는 하지만 윈폼도 MFC와 마찬가지로 마우스로 오브젝트 처리시
Flicker 현상은 발생하기 마련이다.

여러가지 자료를 찾다가 VS2008에서 테스트해본 결과 잘 되는거 같다.
이 자료의 출처는 아래와 같다.
http://www.codeproject.com/KB/GDI-plus/flickerFreeDrawing.aspx

이 자료가 2003 버젼인지 지금 테스트 하고 있는 2008에 맞지 않아서 그냥 카피 복사^^
해서 이식 했다.

잘되는듯 하다.
우선 더 해봐야 할 것이 타이머를 통한 많은 객체의 이동 처리 및 다양한
효과들을 구현해 봐야 할거 같다.

관련코드 :
Posted by gsi
:

사용자 컨트롤 배경 투명색으로 처리 하기

이 부분은 뒷 배경을 투명으로 바꾸기는 하지만 Flicker 처리가 되지 않아서
이동시 잔상이 생기게 되네요.

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace transcontroldemo
{
 /// <summary>
 /// Summary description for TransPanel.
 /// </summary>
 public class TransPanel : Panel
 {
  public TransPanel()
  {
   //
   // TODO: Add constructor logic here
   //
  }

  protected override CreateParams CreateParams
  {
   get
   {
    CreateParams cp = base.CreateParams;
    cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
    return cp;
   }
  }

  protected void InvalidateEx()
  {
   if (Parent == null)
    return;

   Rectangle rc = new Rectangle(this.Location, this.Size);
   Parent.Invalidate(rc, true);
  }

  protected override void OnPaintBackground(PaintEventArgs pevent)
  {
   //do not allow the background to be painted
  }

  protected override void OnResize(EventArgs eventargs)
  {
   this.InvalidateEx();
  }

  Random r = new Random();
  protected override void OnPaint(PaintEventArgs e)
  {
   int h = this.Height / 2;
   int w = this.Width;

   Pen p = new Pen(Color.White, 2);
   e.Graphics.DrawLine( p,  0,h, w, 0);
   p.Dispose();
  }
 }
}


Posted by gsi
:

커스텀 컨트롤 EventHandler 등록하기

사용자 컨트롤을 추가한 후에 EventHandler 를 추가하고 나면 Form에 추가한 컨트롤에서
사용자가 입력한 변수 및 이벤트를 처리할 수 있습니다.
바로 아래 코드는 이벤트 핸들러 처리 코드 입니다.

private string prefix = "";
public event EventHandler PrefixChanged;

public string Prefix
{
    get { return this.prefix; }
    set {
        this.prefix = value;
   
        //PrefixChanged 이벤트를 발생시킨다.
        if (this.PrefixChanged != null)
        {
            PrefixChanged(this, EventArgs.Empty);
        }
        this.Invalidate();
    }
}

Posted by gsi
:

Drag a Panel

하나의 패널 속에 여러개의 패널을 삽입이 가능하다.
이걸 가지고 패널 속에 Visio 와 같은 에디팅 화면을 구현할 수 있을거 같다.
물론 Panel이 아닌 ScrollView 등 다양한 뷰에도 구현이 가능해 진다.

특정 이벤트에 따라서 Panel에 여러개의 Panel 자식 컨트롤을 추가 한 후에
자식 Panel의 이벤트를 사용해서 각각의 패널을 동작시킬 수 있다.

우선 이벤트에 따른 자식 Panel로 등록하는 코드 이다.

private void button2_Click(object sender, EventArgs e)
{
    Panel childPanel = new Panel();
    childPanel.BackColor = System.Drawing.Color.Gainsboro;
    childPanel.Location = new System.Drawing.Point(67, 44);
    childPanel.Name = "panel4";
    childPanel.Size = new System.Drawing.Size(71, 78);
    childPanel.MouseDown += new MouseEventHandler(childPanel_MouseDown);
    childPanel.MouseMove += new MouseEventHandler(childPanel_MouseMove);
    childPanel.MouseUp += new MouseEventHandler(childPanel_MouseUp);
    panel2.Controls.Add(childPanel);
}
- 여러개의 패널이 등록 되지만 이벤트를 처리 하는 함수는 동일하게 가져 가게 되면
  공통적으로 Panel을 처리할 수 있다. (childPanel_MouseDown, Move, Up)

이제 Drag a Panel을 구현하기 위한 코드이다.

private bool dragging = false;
private Point offset;

void childPanel_MouseDown(object sender, MouseEventArgs e)
{
    dragging = true;
    offset = new Point(e.X, e.Y);
}

void childPanel_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        Panel selPanel = (Panel)sender;
        selPanel.Left = e.X + selPanel.Left - offset.X;
        selPanel.Top = e.Y + selPanel.Top - offset.Y;
    }
}

void childPanel_MouseUp(object sender, MouseEventArgs e)
{
    dragging = false;
}

- 전역 변수로 dragging, offset를 선언해 놓는다.
- Down 일때 드래그가 시작되었다고 알리고, 현재 위치를 저장한다.
- Move 일때 드래그라면 현재 선택된 패널 정보를 가져와서 Left, Top를 설정한다.
- Up 일때 드래그가 끝났다고 알린다.

드래그 이벤트는 다양한 컨트롤에서 사용되어 지며, 사용자의 입력을 받아서
처리 되는 다양한 효과를 구현할 수 있다.

관련 MSDN 주소 : http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=689097&SiteID=1

Posted by gsi
:

[C#] - IO 관련 자료

C# 2008. 3. 3. 00:05 |

(펌) - http://blog.naver.com/hahnes2?Redirect=Log&logNo=40023072069

System.IO.BinaryReader

System.IO.BinaryWriter

System.IO.BufferdStream

System.IO.Directory

System.IO.DirectoryInfo

System.IO.DirectoryNotFoundException

System.IO.EndOfStreamException

System.IO.ErrorEventArgs

System.IO.File

System.IO.FileInfo

System.IO.FileLoadException

System.IO.FileNotFoundException

System.IO.FileStream

System.IO.FileSystemEventArgs

System.IO.FileSystemInfo

System.IO.FileSystemWatcher

System.IO.InternalBufferOverflowException

System.IO.IODescriptionAttribute

System.IO.IOException

System.IO.IsolatedStorage.IsolatedStorage

System.IO.IsolatedStorage.IsolatedStorageException

System.IO.IsolatedStorage.IsolatedStorageFile

System.IO.IsolatedStorage.IsolatedStorageFileStream

System.IO.MemoryStream

System.IO.Path

System.IO.PathTooLongException

System.IO.RenamedEventArgs

System.IO.Stream

System.IO.StreamReader

System.IO.StreamWriter

System.IO.StringReader

System.IO.StringWriter

System.IO.TextReader

System.IO.TextWriter

관련 내용을 아주 자세하게 작성해 주셨네요.
감사^^

Posted by gsi
:

Flicker Free Drawing In MFC

이런 주제의 CodeProject 의 내용을 볼 수 있다.
테스트해본 코드 주소는 http://www.codeproject.com/KB/GDI/flickerfree.aspx 이며,
해본 결과 Flicker 를 줄일 수 있었다.

기존의 다른 코드를 사용해서 처리 할때
Release 시 드로잉이 되지 않는 문제점이 발생하였다.
솔직히 이거 때문에 디버깅에 시간이 좀 걸렸다.
나머지 모듈을 다 제거 하고나서야 이 클래스를 사용하지 않고 디버깅을 해봐야 겠다.
생각이 들었고, 빼고 보니 제대로 되었다.
즉, CMemDC 클래스가 이상하다는 것을 알았고,
위의 주소에 있는 내용을 복사해서 처리 하니 되었다.

물론 생성자에 CRect 의 내용도 포함될 수 있는 코드도 있는걸로 봐서
ActiveX 와 같은 곳에서도 사용될 수 있을거 같다.

관련 페이지 >

Sample Image

Posted by gsi
:

MFC 의 Doc, View 부분의 구조를 취하다 보면,
여러개의 다이얼로그를 구성하고 그곳에 데이터의 정보가 연동되는 경우가 있는데,
사실상 이때 new, open, save, saveas 를 고려 해서 작업을 해야 할듯 하다.

어느정도 된 후에 이것을 고려 할려다 보면 많은 부분 수정이 가해진다.

그래서 생각이 든건데, new, save, saveas 가 고려되지 않을 경우에
그 함수를 생성해서 데이터 로직 처리 해보는게 더 좋은 구조를 취할 수 있을거 같다.

더 좋은 방법이 있을까?.
혹.. 더 잘아시는분 있으시면.. 연락주세요 ^^
Posted by gsi
:

파일 저장 다이얼로그

 static char BASED_CODE szFilter[] = "Bitmap Files(*.*)|*.bmp|Jpeg Files(*.*)|*.jpg|Colorplay Files(*.*)|*.colorplay|All Files(*.*)|*.*|";
 CFileDialog dlg(TRUE, _T("*.*"), _T("*.*"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
 dlg.m_ofn.lpstrInitialDir = "";     //기본 경로를 설정한다.

 if(dlg.DoModal() == IDOK)
 {
 }

Posted by gsi
:

파일 저장 다이얼로그

 static char BASED_CODE szFilter[] = "DMXD Files (*.dmxd)|*.dmxd||";
 CFileDialog dlg(FALSE, _T("*.dmxd"), _T("*.dmxd"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);

 if(dlg.DoModal() == IDOK)
 {
 }

Posted by gsi
:

MFC 에서는 크게 발생하지 않았지만 Win32 쪽으로 코드를 옮기면서
몇가지 컴파일 오류들이 나왔다. 아래의 오류는 #inlcude <string>가 인클루드 되지 않아서
발생하는 문제였다.

#include <string>

c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : 'const std::_Tree<_Traits> &'의 템플릿 인수를 'const std::string'에서 추론할 수 없습니다.
        c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(1170) : 'std::operator`<'' 선언을 참조하십시오.
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : 'const std::_Tree<_Traits> &'의 템플릿 인수를 'const std::string'에서 추론할 수 없습니다.
        c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(1170) : 'std::operator`<'' 선언을 참조하십시오.
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : 'const std::vector<_Ty,_Ax> &'의 템플릿 인수를 'const std::string'에서 추론할 수 없습니다.
        c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\vector(915) : 'std::operator`<'' 선언을 참조하십시오.
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : 'const std::vector<_Ty,_Ax> &'의 템플릿 인수를 'const std::string'에서 추론할 수 없습니다.
        c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\vector(915) : 'std::operator`<'' 선언을 참조하십시오.
Posted by gsi
:

웹서버별 마임 추가 방법

Http 프로토콜을 이용한 파일 다운로드시 해당 파일의 사이즈를 아래의
코드를 통해서 읽어 오게 됩니다.

HttpQueryInfo (g_hURL, HTTP_QUERY_CONTENT_LENGTH, szLengthBuf, &dwLengthBufQuery, NULL);

하지만 이때 원하는 용량이 넘어 오지 않고, 1430 인가(?) 하는 특정 바이트 수만
넘어 올때가 있습니다.

물론 이때 오류 처리 하는 코드가 따로 있는걸로 알고 있구요.
그 오류는 404 오류 즉, 해당 파일을 찾을 수 없다는 걸로 나오게 됩니다.

문제의 해답은..
이미 알려져 있고 규정되어 있는 확장자만 다운로드가 가능하다는 건데요.
IIS에서 확장해서 별도의 확장자를 추가할 수 있습니다.
  HTTP 헤더 > MIME 형식 > 원하는 확장자 추가...

자세한 방법은 아래의 블로그 내용을 참조 하시면 됩니다.
주소 : http://cafe.naver.com/okwinc.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=22
Posted by gsi
:

기존의 .NET의 책을 보다 보면 지금의 2008이 얼마나 자동화를 많이 해주는지를
알 수 있다.

하지만 내면에 감추어진 여러가지 컴파일의 특성과 각종 기능들에 대해서
알지 못하고 가는 오류를 범하기도 하는거 같다.

사실 개발자로서 툴에 의존적이 되다 보니 cmd 창에서 이루어 지는 컴파일이나
각종 번거로운 작업들이 매번 귀찮게만 느껴지게 된다.

하지만 이런 부분을 알고나면 다 많은 것을 보게 되는 시각이 생기게 되는거 같다...

역시 공부는 하면 할 수록 더 어려워 지는거 같다는 생각이 많이 든다.
그만큼 많이 알아 간다는 뜻이기도 하겠지만. 말이다.

나를 위해서.. 화이팅..
Posted by gsi
:

마우스가 해당 View의 영역 밖으로 나갈때 처리 방법.

해당 View의 영역에 커서가 위치할 때랑 커서가 밖으로 나갔을때 다르게 처리 하고 싶을때가 발생한다. 이때는 SetCursor를 이용하면 된다.

즉, 해당 어플리케이션의 MainFrame 에서 SetCursor 부분에서 해당 View의 클래스 포인터의 값을 비교해서 처리 하면 된다.

코드는 아래와 같다.
BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
 if( pWnd == g_PixelMapView )
 {
 }
 else // 해당 포인터가 다를 경우, 즉 다른 윈도우일 경우...
 {
  if( g_PixelMapView )
   g_PixelMapView->OutCursorDCxRop();
 }
 return CFrameWnd::OnSetCursor(pWnd, nHitTest, message);
}

이때 한가지 문제점은 있다. 마우스가 갑자가 해당 메인 프레임 밖으로 이동하게 되면
이 함수는 호출 되지 않는다. 그정도를 감안한다면 이 코드도 괜찮을듯 하다.
Posted by gsi
: