'CSharp'에 해당되는 글 9건

  1. 2009.09.10 String to Byte[]
  2. 2009.08.04 Form과 UserControl의 AutoScaleMode 속성
  3. 2009.06.12 디자인 타임에서 자식 추가 가능하게 만들기
  4. 2009.05.13 이벤트 만들 시 주의사항 ( 제너릭 EventArgs에 대하여 )
  5. 2009.03.31 파일 공간 미리 확보하기
  6. 2009.01.30 프로젝트 항목과 다른 파일 프로젝트에 포함시키기
  7. 2009.01.22 String Encoding
  8. 2009.01.21 표시되는 Text 사이즈 구하기
  9. 2009.01.17 프로그램 한 번만 실행 시키기

String to Byte[]

|

보통 Byte 배열과 String 간의 변환을 할 경우 다음과 같이 이용할 것입니다.

public static String ToString(Byte[] bytes)
{
    return Encoding.UTF8.GetString(bytes);
}

public static Byte[] ToBytes(String s)
{
    return Encoding.UTF8.GetBytes(s);
}

하지만 암호화한 Byte배열을 그대로 이용한다면 에러를 내뱉습니다.

그래서 다음과 같이 변환을 해야 합니다.

public static String ToString(Byte[] bytes)
{
    return Encoding.UTF8.GetString(Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, bytes));
}

public static Byte[] ToBytes(String s)
{
    return Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8.GetBytes(s));
}
And

Form과 UserControl의 AutoScaleMode 속성

|

우선 AutoScaleMode 속성에 대한 MSDN입니다.
http://msdn.microsoft.com/ko-kr/library/system.windows.forms.containercontrol.autoscalemode.aspx

다음은 AutoScaleMode 열거 형에 대한 MSDN입니다.
http://msdn.microsoft.com/ko-kr/library/system.windows.forms.autoscalemode.aspx

AutoSacleMode 열거 형은 None, Font, Dpi, Inherit 이렇게 4가지가 존재합니다.

None : 자동 스케일 변경 없음
Font : 폰트 사이즈에 따른 스케일 변경
Dpi : 화면 해상도 Dpi 변경에 따른 스케일 변경
Inherit : 부모의 상태를 따름

기본적으로 Form과 UserControl은 Font로 설정되어져 있습니다.
이 설정은 Font가 변경이 되면 Form과 UserControl의 크기가 재조정되고 내부의 컨트롤들의 위치도 재배치됩니다.
이렇게 되면 원하지 않는 UI가 나오게 되기 때문에 이 설정은 이용하지 않는 것이 좋겠습니다.

그냥 무조건 개발 당시의 화면으로 나오게 하고 싶으면 None을 이용하면 됩니다.
None은 윈도우의 Dpi 변경해도 동일한 화면크기로 프로그램이 실행됩니다.

현재 대부분의 모니터가 96dpi로 맞추어져서 나오기 때문에 None을 이용하여 고정하여도 되지만
나중에 나오는 모니터의 dpi가 96dpi로 나온다는 보장이 없기 때문에 Dpi를 이용하여 윈도우의 Dpi변경에 의한
자동 사이즈 변경이 가능하도록 개발하는 것이 좋겠습니다.

Dpi로 설정할 시에 주의할 점이 있습니다.
각 컨트롤의 사이즈가 자동으로 조정하지만 이미지의 사이즈는 설정한 대로 나온다는 것입니다.
이미지를 Tile옵션으로 하면 이미지컨트롤의 사이즈가 변경이 되어도 이미지 자체의 사이즈는 변경되지 않기 때문에
Stretch옵션을 이용하여 컨트롤 사이즈가 변하면 이미지도 따라 변하게 만들어 주어야 합니다.
또 한가지는 UserControl의 AutoScaleMode 속성은 Inherit으로 설정하여야 한다는 것입니다.
UserControl의 AutoScaleMode 속성도 Dpi로 할 경우에 UserControl내의 컨트롤의 사이트와 위치가
원하지 않게 나타납니다. ( 원인은 저도 모릅니다만 아마 UserControl의 AutoScaleMode가 먼저 적용된 뒤에 Form이 적용되면서 이상해 지지 않나 싶습니다. )
  ( 주의할점 추가 - SplitContainer를 이용할 경우에도 이상한 UI로 변경됩니다. )

앞으로 AutoScaleMode속성은 Form의 경우에는 Dpi로 UserControl의 경우에는 Inherit으로 설정하도록 합시다.

And

디자인 타임에서 자식 추가 가능하게 만들기

|

using System.Windows.Forms;
using System.ComponentModel;
using System.ComponentModel.Design;

[Designer("System.Windows.Forms.Design.ParentControlDesigner,System.Design", typeof(IDesigner))]
public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }
}

[Designer("System.Windows.Forms.Design.ParentControlDesigner,System.Design", typeof(IDesigner))]
이 Attribute를 이용하면 끝.

And

이벤트 만들 시 주의사항 ( 제너릭 EventArgs에 대하여 )

|

이 이벤트 발생시 전달하는 클래스를 제너릭으로 만들면 동작은 잘 되지만
이벤트 생성 처리시에 문제가 있다.
여기서의 생성 처리시 문제란 VS가 자동으로 생성해 주는 경우이다.

void textBox1_TextChanged(object sender)
{

}

원래는 이렇게 생성 되어야 한다.
물론 위의 것을 아래로 수정해도 된다.
void textBox1_TextChanged(object sender, DChangeEventArgs<String> e)
{

}

이 문제의 해결은 제너릭으로 만들어 진 것을 다시 상속받아 제너릭이 아니게 만들면 된다.
class DTextChangeEventArgs : DChangeEventArgs<String>
{
	public DTextChangeEventArgs(String oldValue, String newValue) : base(oldValue, newValue)
	{
	}
}

물론 EventHandler<T> 도 문제가 있으므로
이것은 직접 delegate를 이용한 EventHandler를 만들어 이용하도록 하자.
//public event EventHandler<DTextChangeEventArgs> TextChanged;

public delegate void DTextChangeEventHandler(object sender, DTextChangeEventArgs e);
public event DTextChangeEventHandler TextChanged;

And

파일 공간 미리 확보하기

|

using (FileStream file = new FileStream("Text.txt", FileMode.Create, FileAccess.Write, FileShare.None))
{
    Console.WriteLine(file.Length);
    file.SetLength(1*1024*1024*1024);
    Console.WriteLine(file.Length);
}

void FileStream.SetLength(long value) 함수를 이용하여 미리 공간 확보할 수 있습니다.

And

프로젝트 항목과 다른 파일 프로젝트에 포함시키기

|

1. exe 출력 디렉터리로 같이 내보내기
파일을 빌드 시 exe파일과 같은 경로에 있게 하려면 파일 속성중 [출력 디렉터리로 복사] 설정을 [변경된 내용만 복사]로 변경 하시면 됩니다. 혹은 [항상 복사]로 변경 하시면 됩니다.

2. ClickOnce 배포 시 같이 배포하기
그리고 ClickOnce로 배포 시 파일이 포함되게 하려면
먼저 해당 파일 속성의 [빌드 작업] 속성을 [내용]으로 변경 하시고
[프로젝트 속성]-[게시]-[응용프로그램 파일]의 해당 파일의 게시 상태를 [포함(자동)]으로 변경해 주시면 됩니다.

And

String Encoding

|

ASCII - ASCII 코드를 이용하여 변환 ( 7bit ASCII 코드 : 0x0000 ~ 0x007F의 유니코드 )
Unicode - Unicode를 이용하여 변환
Default - 현재 시스템의 ASCII 코드 기본값 이용 ( 설치되어있는 운영체제의 기본 언어에 따라 달라짐
             , 한국 보통 CHCP949 )

string result = Encoding.Default.GetString(buff);
And

표시되는 Text 사이즈 구하기

|

System.Drawing.Graphics 클래스 MeasureString 매서드 이용
>

public Size GetTextSize(IntPtr hdc, String str, Font font)
{
    Graphics g = Graphics.FromHwnd(hdc);
    SizeF sizeF = g.MeasureString(str, font);
    return sizeF.ToSize();
}

And

프로그램 한 번만 실행 시키기

|
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ConsoleApplication2
{
  class Program
  {
    static void Main(string[] args)
    {
      bool b;

      Mutex m = new Mutex(false, "TestMutex", out b);

      if (b == false)
      {
        Console.WriteLine("이미 실행중인 프로그램이 있습니다.");
        return;
      }

      Console.WriteLine("엔터를 누르면 프로그램이 종료됩니다.");
      Console.ReadLine();
    }
  }
}

Mutex생성시 이름을 정하면 그 이름은 시스템에 등록 됩니다.
그러기 때문에 Mutex를 이름을 정하여 생성하고 소멸되지 않은 상태에서
같은 이름의 Mutex를 생성하게 되면 최초 생성한 것인지 아닌지를 확인할 수 있습니다.
물론 Mutex가 소멸되면 시스템에서도 해제 됩니다.
And
prev | 1 | next