ゆく年くる年2009年01月12日 13:51

年賀状スタイルです。
今年は、丑年なので、牛をあしらって
もらいました。

C# レガシーウインドー2009年01月12日 10:50

あけまして、おめでとうございます。
本年もよろしくお願いします。

C# GDI+上で、GDIを再現してみました。
その意味で、レガシーウインドーです。
VC++のWindowsAPIを使っています。

C#にも線描のAPIがあるのに、なぜかといいますと
線描の軌跡を保存することが
非常にむずかしいからです。

で、線がすぐに消えるので、
ラインアートを実現するには、レガシー
ウインドーが実現できれば、OKかなというのが
動機です。

クラスでサポートできれば、
それほどむずかしくないと思います。
APIは、VC++のAPIを参照すれば
解決してゆくとおもいます。

タイマーを使った、OnPaintで
ダブルバッファ指定はなしです。
.
/*---------------------------------*/
/* カラーペン作成 */
/*---------------------------------*/

pen = Win32GDI.CreatePen(
Win32GDI.PenStyle.PS_SOLID, penWidth, (uint)ColorTranslator.ToWin32(col));

IntPtr oldpen = Win32GDI.SelectObject(hMemDC, pen);



/*---------------------------------*/
/* 線描 始点->終点   */
/*---------------------------------*/
if (freeline == 1)
{
Win32GDI.MoveToEx(hMemDC, sx, sy, IntPtr.Zero);

Win32GDI.LineTo(hMemDC, ex, ey);
sx = ex;
sy = ey;

}

参考クラス

class Win32GDI
{
public enum PenStyle
{

PS_SOLID = 0 //実線
など

};

public enum BrushStyles
{
BS_SOLID = 0,
BS_NULL = 1,
BS_HATCHED = 2,
BS_PATTERN = 3,
など
}

public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;

public void rect(int left,int top,int right,int bottom)
{
this.left = left;
this.right = right;
this.top = top;
this.bottom = bottom;

}

}


// 透明、不透明
public const int TRANSPARENT = 1;
public const int OPAQUE = 2;

// Constants used by uFormat argument of DrawText call
private const int DT_TOP = 0x00000000;
private const int DT_LEFT = 0x00000000;
private const int DT_CENTER = 0x00000001;
private const int DT_RIGHT = 0x00000002;
private const int DT_VCENTER = 0x00000004;
private const int DT_BOTTOM = 0x00000008;
private const int DT_WORDBREAK = 0x00000010;


public const int PATCOPY = 0xF00021;

public const int SRCCOPY = 13369376;

[DllImport("gdi32.dll", EntryPoint = "DeleteDC")]
public static extern IntPtr DeleteDC(IntPtr hDc);

[DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
public static extern IntPtr DeleteObject(IntPtr hDc);

[DllImport("gdi32.dll", EntryPoint = "BitBlt")]
public static extern bool BitBlt(IntPtr hsrcDest, int xDest,
int yDest, int wDest, int hsrcDest, IntPtr hdcSource,
int xSrc, int ySrc, int ROp);

[DllImport("gdi32.dll", EntryPoint = "CreateCompatibleBitmap")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc,
int nWidth, int nHeight);

[DllImport("gdi32.dll", EntryPoint = "CreateCompatibleDC")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

[DllImport("gdi32.dll", EntryPoint = "SelectObject")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);


[DllImport("gdi32.dll", EntryPoint = "TextOut")]
public static extern bool TextOut(IntPtr hdcDest, int x, int y, string moji, int nagasa);

[DllImport("gdi32.dll", EntryPoint = "LineTo")]
public static extern bool LineTo(IntPtr hDC, int x, int y);

[DllImport("gdi32.dll", EntryPoint = "MoveToEx")]
public static extern bool MoveToEx(IntPtr hDC, int x, int y, IntPtr OldPoint);

[DllImport("gdi32.dll")]
public static extern IntPtr CreatePen(PenStyle fnPenStyle, int nWidth, uint crColor);

[DllImportAttribute("gdi32.dll", EntryPoint = "CreateSolidBrush")]
//public static extern IntPtr CreateSolidBrush(BrushStyles enBrushStyle, int crColor);
public static extern IntPtr CreateSolidBrush(int crColor);

[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true,
EntryPoint = "PatBlt")]
public static extern bool PatBlt(IntPtr hdc, int left, int top, int width, int height, int rop);

[DllImport("gdi32.dll")]
public static extern int SetBkMode(IntPtr hdc, int iBkMode);

[DllImport("gdi32.dll")]
public static extern uint SetTextColor(IntPtr hdc, int crColor);

[DllImport("user32.dll")]
public static extern int DrawText(IntPtr hdc, string lpString, int nCount,
ref RECT lpRect, uint uFormat);

[DllImport("gdi32")]
public static extern bool Ellipse(IntPtr hdc, int nLeft, int nTop, int nRight, int nBottom);

2008年 クリスマスです2009年01月12日 10:27

遅くなりましたが、
2008年度版クリスマスカードです

レガシーウインドーを使っています
一応、C#上でWindwos API
を使っています

Win32GDI.MoveToEx(hMemDC, sx, sy, IntPtr.Zero);

Win32GDI.LineTo(hMemDC, ex, ey);

線描によるラインアートの
改良点描です

2008年振り返って2008年12月23日 15:26

今年は、職場のコンピュータがhpのシンクライアントシステムで
書き込もうとすると、ファイアーウオールに阻まれて
書き込めませんでした。

でも、やはり感動の一年でした。
自分たちの日ごろ感じるところは、何らかの形で
表現し、残していく努力は必要だと思います。

本日、迷宮美術館を見て、書家アーティストの筆致に感動し
中国の張大千画伯の作品に感動し
敦煌の模写は目を見張りました。

何とか、blog再開に向けてがんばりたいと思います
丑年、不況をみんなの情熱で押し返しましょう。

vista Tomcat 5.0 動きましたあ2008年03月10日 10:33

Tomcat6.xがいいと思いましたが、これが以外にトラブリました。
http://localhost:8080/とやってもTomキャットがでてきません。
Configのweb.xml、server.xmlをいろいろと操作してみましたが
びくともしません。

また、DefaultのインストールでProgram Filesにインストール
をかけた場合、Vistaでは書き込みを許可してくれませんので
別途Tomcat5.0のようにCドライブ直下にインストール
しないと駄目です。

Tomcat6.xをあきらめ、Tomcat5.5にグレードダウンしましたら
トム猫君が、ニャーとでてきました。

これで、サーブレットが動くかなあと思ったら、
TomcatのサーブレットAPIにクラスパスが通ってなかったので
通しました。マイコンピューターのプロパティの詳細の
環境変数のCLASSPATHの設定です。
servlet-api.jarは、Tomcatのcommonのlibの中におきます。

Tomcat 5.0\common\lib\servlet-api.jar

けれど、これでもサーブレットAPIでシンタックスエラーが
でました。再度
CATALINA_HOME Tomcat5.5のインストールフォルダー
CATALINA_BASE Tomcat5.5のインストールフォルダー
CLASSPATH    servlet-api.jarの場所
            (Tomcat5.5のcommonのlibの中)
Path Tomcat5.5のbinフォルダー java sdkのbinフォルダー

で、原因がわからず、再起動をかけてみたら
コンパイルできましたあ!

やっと動き出しました!

で、一難去って、二難に遭遇しましたあ。
mdbにアクセスできません!
強力なエラーメッセージがでました。
JDBC ODBC ドライバーはインストール済みだそうで

//ODBC-JDBC Bridge Driver ローディング
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

//AccessへODBC DSNを介して接続
String url = "jdbc:odbc:meibo";
String user = "";
String password = "";

Connection con
= DriverManager.getConnection(url,user,password);

で、ODBCデータソースの設定もやってみたのですが
いろいろとやっても接続させてもらえません。
JDBC ODBC ブリッジ ドライバーは動いてくれません。
データの作成の都合上アクセスを使っているだけなので
早速、Mysqlに乗り換えました。
mdbはMysql Migration Toolkitを使って変換します。
meiboデータベースのmeiboテーブルにアクセスします。
イッパーツ

try{

Class.forName("org.gjt.mm.mysql.Driver");


String url="jdbc:mysql:///meibo?useUnicode=true&characterEncoding=utf-8";

String user = "root";
String password = "xxxx";

Connection con
= DriverManager.getConnection(url,user,password);





以下は参考までに、サンプルソースコードです。
名簿テーブルを読んでいます。

//SQL実行
Statement stmt = con.createStatement();
StringBuffer query = new StringBuffer();
query.append("SELECT simei, seibetu, ketueki, umare, home_tel, k_tel, info FROM meibo WHERE kubun = '");

query.append(kubunStr);

query.append("' ORDER BY umare");

ResultSet rs = stmt.executeQuery(query.toString());


//検索結果 取得

while(rs.next()){

simei = rs.getString("simei");

seibetu = rs.getString("seibetu");

ketueki = rs.getString("ketueki");

umare = rs.getString("umare");

home_tel = rs.getString("home_tel");

k_tel = rs.getString("k_tel");

info = rs.getString("info");


sb.append(" <TR>");

sb.append(" <TD ALIGN='CENTER' BGCOLOR='blue'>");

sb.append(" <INPUT TYPE='RADIO' NAME='HOME_TEL' VALUE='");

sb.append( home_tel);

if(firstData_flg){

sb.append( "' CHECKED>");

firstData_flg = false;

}else{

sb.append( "'>");

}

sb.append(" </TD>");

sb.append(" <TD>");

sb.append( simei);

sb.append(" </TD>");

sb.append(" <TD>");

sb.append( seibetu);

sb.append(" </TD>");

sb.append(" <TD>");

sb.append( ketueki);

sb.append(" </TD>");

sb.append(" <TD>");

sb.append( umare);

sb.append(" </TD>");

sb.append(" <TD>");

sb.append( home_tel);

sb.append(" </TD>");

sb.append(" <TD>");

sb.append( k_tel);

sb.append(" </TD>");

sb.append(" <TD>");

sb.append( info);

sb.append(" </TD>");

sb.append(" </TR>");

}


sb.append("</TABLE><BR>");

sb.append("<INPUT TYPE='SUBMIT' VALUE='");

sb.append("削除");

sb.append("'>");

sb.append("</FORM>");

sb.append("</CENTER><BR><BR>");

sb.append("<HR><A HREF='http://localhost:8080/servlets-examples/delete.html'>");

sb.append("名簿削除に戻る");

sb.append("</A> ");

sb.append("<A HREF='http://localhost:8080/servlets-examples/index.html'>");

sb.append("メニューへ戻る");

sb.append("</A>");

sb.append("</BODY>");

sb.append("</HTML>");

out.println(sb.toString());


//切断

stmt.close();

con.close();

}

//例外処理

catch(SQLException ex){

out.println("--- JDBC MYSQL---" + "<BR>");

out.println("Message :" + "<BR>");

while(ex != null){

out.println(ex.getMessage() + "<BR>");

ex = ex.getNextException();

}

}

catch(Exception ex){

ex.printStackTrace(out);

}