ゆく年くる年 ― 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);
本年もよろしくお願いします。
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年度版クリスマスカードです
レガシーウインドーを使っています
一応、C#上でWindwos API
を使っています
Win32GDI.MoveToEx(hMemDC, sx, sy, IntPtr.Zero);
Win32GDI.LineTo(hMemDC, ex, ey);
線描によるラインアートの
改良点描です
2008年振り返って ― 2008年12月23日 15:26
今年は、職場のコンピュータがhpのシンクライアントシステムで
書き込もうとすると、ファイアーウオールに阻まれて
書き込めませんでした。
でも、やはり感動の一年でした。
自分たちの日ごろ感じるところは、何らかの形で
表現し、残していく努力は必要だと思います。
本日、迷宮美術館を見て、書家アーティストの筆致に感動し
中国の張大千画伯の作品に感動し
敦煌の模写は目を見張りました。
何とか、blog再開に向けてがんばりたいと思います
丑年、不況をみんなの情熱で押し返しましょう。
書き込もうとすると、ファイアーウオールに阻まれて
書き込めませんでした。
でも、やはり感動の一年でした。
自分たちの日ごろ感じるところは、何らかの形で
表現し、残していく努力は必要だと思います。
本日、迷宮美術館を見て、書家アーティストの筆致に感動し
中国の張大千画伯の作品に感動し
敦煌の模写は目を見張りました。
何とか、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);
}
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);
}
最近のコメント