お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"マウスカーソル作成(CreateCursor)"





  CreateCursor APIを使って、マウスカーソルを(リソースからのロードで
  なく)プログラム中で動的に作成するサンプルです。
  #Win95a + Delphi3.1で動作を確認しました。

---------- ここから ----------
const
  MyCursor = 1;

procedure TForm1.Button1Click(Sender: TObject);
var
  Am,Xm: array[0..127]of Byte;
  cur: HCURSOR;
begin
  {
    ------------  ANDmask  ------------
    .は 0と定義する(マウスカーソルの黒い縁取り部分)
    *は 0と定義する(マウスカーソルの白い部分)
    .1111111 11111111 11111111 11111111
    ..111111 11111111 11111111 11111111
    .*.11111 11111111 11111111 11111111
    .**.1111 11111111 11111111 11111111
    .***.111 11111111 11111111 11111111
    .****.11 11111111 11111111 11111111
    .*****.1 11111111 11111111 11111111
    .******. 11111111 11111111 11111111
    .******* .1111111 11111111 11111111
    .******* *.111111 11111111 11111111
    .******* **.11111 11111111 11111111
    .******* ***.1111 11111111 11111111
    .******* ****.111 11111111 11111111
    .******* *****.11 11111111 11111111
    .******* ******.1 11111111 11111111
    .******* *******. 11111111 11111111

    .******* ******** .1111111 11111111
    .******* ******** *.111111 11111111
    .******* ******** **.11111 11111111
    .******* ******** ***.1111 11111111
    .******* ******** ****.111 11111111
    .******* ******** *****.11 11111111
    .******* *....... .......1 11111111
    .******* .1111111 11111111 11111111
    .******. 11111111 11111111 11111111
    .*****.1 11111111 11111111 11111111
    .****.11 11111111 11111111 11111111
    .***.111 11111111 11111111 11111111
    .**.1111 11111111 11111111 11111111
    .*.11111 11111111 11111111 11111111
    ..111111 11111111 11111111 11111111
    .1111111 11111111 11111111 11111111
  }
  Am[  0]:=$7F;  Am[  1]:=$FF;  Am[  2]:=$FF;  Am[  3]:=$FF;
  Am[  4]:=$3F;  Am[  5]:=$FF;  Am[  6]:=$FF;  Am[  7]:=$FF;
  Am[  8]:=$1F;  Am[  9]:=$FF;  Am[ 10]:=$FF;  Am[ 11]:=$FF;
  Am[ 12]:=$0F;  Am[ 13]:=$FF;  Am[ 14]:=$FF;  Am[ 15]:=$FF;
  Am[ 16]:=$07;  Am[ 17]:=$FF;  Am[ 18]:=$FF;  Am[ 19]:=$FF;
  Am[ 20]:=$03;  Am[ 21]:=$FF;  Am[ 22]:=$FF;  Am[ 23]:=$FF;
  Am[ 24]:=$01;  Am[ 25]:=$FF;  Am[ 26]:=$FF;  Am[ 27]:=$FF;
  Am[ 28]:=$00;  Am[ 29]:=$FF;  Am[ 30]:=$FF;  Am[ 31]:=$FF;
  Am[ 32]:=$00;  Am[ 33]:=$7F;  Am[ 34]:=$FF;  Am[ 35]:=$FF;
  Am[ 36]:=$00;  Am[ 37]:=$3F;  Am[ 38]:=$FF;  Am[ 39]:=$FF;
  Am[ 40]:=$00;  Am[ 41]:=$1F;  Am[ 42]:=$FF;  Am[ 43]:=$FF;
  Am[ 44]:=$00;  Am[ 45]:=$0F;  Am[ 46]:=$FF;  Am[ 47]:=$FF;
  Am[ 48]:=$00;  Am[ 49]:=$07;  Am[ 50]:=$FF;  Am[ 51]:=$FF;
  Am[ 52]:=$00;  Am[ 53]:=$03;  Am[ 54]:=$FF;  Am[ 55]:=$FF;
  Am[ 56]:=$00;  Am[ 57]:=$01;  Am[ 58]:=$FF;  Am[ 59]:=$FF;
  Am[ 60]:=$00;  Am[ 61]:=$00;  Am[ 62]:=$FF;  Am[ 63]:=$FF;
  Am[ 64]:=$00;  Am[ 65]:=$00;  Am[ 66]:=$7F;  Am[ 67]:=$FF;
  Am[ 68]:=$00;  Am[ 69]:=$00;  Am[ 70]:=$3F;  Am[ 71]:=$FF;
  Am[ 72]:=$00;  Am[ 73]:=$00;  Am[ 74]:=$1F;  Am[ 75]:=$FF;
  Am[ 76]:=$00;  Am[ 77]:=$00;  Am[ 78]:=$0F;  Am[ 79]:=$FF;
  Am[ 80]:=$00;  Am[ 81]:=$00;  Am[ 82]:=$07;  Am[ 83]:=$FF;
  Am[ 84]:=$00;  Am[ 85]:=$00;  Am[ 86]:=$03;  Am[ 87]:=$FF;
  Am[ 88]:=$00;  Am[ 89]:=$00;  Am[ 90]:=$01;  Am[ 91]:=$FF;
  Am[ 92]:=$00;  Am[ 93]:=$7F;  Am[ 94]:=$FF;  Am[ 95]:=$FF;
  Am[ 96]:=$00;  Am[ 97]:=$FF;  Am[ 98]:=$FF;  Am[ 99]:=$FF;
  Am[100]:=$01;  Am[101]:=$FF;  Am[102]:=$FF;  Am[103]:=$FF;
  Am[104]:=$03;  Am[105]:=$FF;  Am[106]:=$FF;  Am[107]:=$FF;
  Am[108]:=$07;  Am[109]:=$FF;  Am[110]:=$FF;  Am[111]:=$FF;
  Am[112]:=$0F;  Am[113]:=$FF;  Am[114]:=$FF;  Am[115]:=$FF;
  Am[116]:=$1F;  Am[117]:=$FF;  Am[118]:=$FF;  Am[119]:=$FF;
  Am[120]:=$3F;  Am[121]:=$FF;  Am[122]:=$FF;  Am[123]:=$FF;
  Am[124]:=$7F;  Am[125]:=$FF;  Am[126]:=$FF;  Am[127]:=$FF;
  {
    ------------  XORmask  ------------
    *は 1と定義する(マウスカーソルの白い部分)
    00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000
    0*000000 00000000 00000000 00000000
    0**00000 00000000 00000000 00000000
    0***0000 00000000 00000000 00000000
    0****000 00000000 00000000 00000000
    0*****00 00000000 00000000 00000000
    0******0 00000000 00000000 00000000
    0******* 00000000 00000000 00000000
    0******* *0000000 00000000 00000000
    0******* **000000 00000000 00000000
    0******* ***00000 00000000 00000000
    0******* ****0000 00000000 00000000
    0******* *****000 00000000 00000000
    0******* ******00 00000000 00000000
    0******* *******0 00000000 00000000

    0******* ******** 00000000 00000000
    0******* ******** *0000000 00000000
    0******* ******** **000000 00000000
    0******* ******** ***00000 00000000
    0******* ******** ****0000 00000000
    0******* ******** *****000 00000000
    0******* *0000000 00000000 00000000
    0******* 00000000 00000000 00000000
    0******0 00000000 00000000 00000000
    0*****00 00000000 00000000 00000000
    0****000 00000000 00000000 00000000
    0***0000 00000000 00000000 00000000
    0**00000 00000000 00000000 00000000
    0*000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000
  }
  Xm[  0]:=$00;  Xm[  1]:=$00;  Xm[  2]:=$00;  Xm[  3]:=$00;
  Xm[  4]:=$00;  Xm[  5]:=$00;  Xm[  6]:=$00;  Xm[  7]:=$00;
  Xm[  8]:=$40;  Xm[  9]:=$00;  Xm[ 10]:=$00;  Xm[ 11]:=$00;
  Xm[ 12]:=$60;  Xm[ 13]:=$00;  Xm[ 14]:=$00;  Xm[ 15]:=$00;
  Xm[ 16]:=$70;  Xm[ 17]:=$00;  Xm[ 18]:=$00;  Xm[ 19]:=$00;
  Xm[ 20]:=$78;  Xm[ 21]:=$00;  Xm[ 22]:=$00;  Xm[ 23]:=$00;
  Xm[ 24]:=$7C;  Xm[ 25]:=$00;  Xm[ 26]:=$00;  Xm[ 27]:=$00;
  Xm[ 28]:=$7E;  Xm[ 29]:=$00;  Xm[ 30]:=$00;  Xm[ 31]:=$00;
  Xm[ 32]:=$7F;  Xm[ 33]:=$00;  Xm[ 34]:=$00;  Xm[ 35]:=$00;
  Xm[ 36]:=$7F;  Xm[ 37]:=$80;  Xm[ 38]:=$00;  Xm[ 39]:=$00;
  Xm[ 40]:=$7F;  Xm[ 41]:=$C0;  Xm[ 42]:=$00;  Xm[ 43]:=$00;
  Xm[ 44]:=$7F;  Xm[ 45]:=$E0;  Xm[ 46]:=$00;  Xm[ 47]:=$00;
  Xm[ 48]:=$7F;  Xm[ 49]:=$F0;  Xm[ 50]:=$00;  Xm[ 51]:=$00;
  Xm[ 52]:=$7F;  Xm[ 53]:=$F8;  Xm[ 54]:=$00;  Xm[ 55]:=$00;
  Xm[ 56]:=$7F;  Xm[ 57]:=$FC;  Xm[ 58]:=$00;  Xm[ 59]:=$00;
  Xm[ 60]:=$7F;  Xm[ 61]:=$FE;  Xm[ 62]:=$00;  Xm[ 63]:=$00;
  Xm[ 64]:=$7F;  Xm[ 65]:=$FF;  Xm[ 66]:=$00;  Xm[ 67]:=$00;
  Xm[ 68]:=$7F;  Xm[ 69]:=$FF;  Xm[ 70]:=$80;  Xm[ 71]:=$00;
  Xm[ 72]:=$7F;  Xm[ 73]:=$FF;  Xm[ 74]:=$C0;  Xm[ 75]:=$00;
  Xm[ 76]:=$7F;  Xm[ 77]:=$FF;  Xm[ 78]:=$E0;  Xm[ 79]:=$00;
  Xm[ 80]:=$7F;  Xm[ 81]:=$FF;  Xm[ 82]:=$F0;  Xm[ 83]:=$00;
  Xm[ 84]:=$7F;  Xm[ 85]:=$FF;  Xm[ 86]:=$F8;  Xm[ 87]:=$00;
  Xm[ 88]:=$7F;  Xm[ 89]:=$80;  Xm[ 90]:=$00;  Xm[ 91]:=$00;
  Xm[ 92]:=$7F;  Xm[ 93]:=$00;  Xm[ 94]:=$00;  Xm[ 95]:=$00;
  Xm[ 96]:=$7E;  Xm[ 97]:=$00;  Xm[ 98]:=$00;  Xm[ 99]:=$00;
  Xm[100]:=$7C;  Xm[101]:=$00;  Xm[102]:=$00;  Xm[103]:=$00;
  Xm[104]:=$78;  Xm[105]:=$00;  Xm[106]:=$00;  Xm[107]:=$00;
  Xm[108]:=$70;  Xm[109]:=$00;  Xm[110]:=$00;  Xm[111]:=$00;
  Xm[112]:=$60;  Xm[113]:=$00;  Xm[114]:=$00;  Xm[115]:=$00;
  Xm[116]:=$40;  Xm[117]:=$00;  Xm[118]:=$00;  Xm[119]:=$00;
  Xm[120]:=$00;  Xm[121]:=$00;  Xm[122]:=$00;  Xm[123]:=$00;
  Xm[124]:=$00;  Xm[125]:=$00;  Xm[126]:=$00;  Xm[127]:=$00;

  cur := CreateCursor(hInstance, 1, 2, 32, 32, @Am[0], @Xm[0]);
  Screen.Cursors[MyCursor] := cur;
  Form1.Cursor := MyCursor;
end;
---------- ここまで ----------

  ANDmask,XORmaskの2つのビットパターンを作成する必要がありますが、
  これらのビットの組み合わせの意味は、以下のようになります。

  ANDmask | XORmask
  --------+--------
     0    |    0    黒
     0    |    1    白
     1    |    0    画面(いわゆる透明色)
     1    |    1    反転
  --------+--------

  なお、Screen.Cursors[]に代入したカーソルハンドルは、プログラム終了時
  に自動的に DestroyCursorされます。(たぶん)

  いったん Screen.Cursors[MyCursor] := cur;を実行後に、別のカーソルを
  CreateCursorして、同じ MyCursorに
  Screen.Cursors[MyCursor] := 新しいカーソルハンドル;
  と上書きしても大丈夫です。
  上書きの時点で、もとの Screen.Cursors[MyCursor]は自動的に DestroyCursor
  されます。
  Screen.Cursors[MyCursor] := 0;とすれば、Screen.Cursors[MyCursor]に代
  入されていたカーソルハンドルが DestroyCursorされます。

  というわけで、Screen.Cursors[?]に代入してしまえば、DestroyCursorなん
  て気にする必要はなさそうです。
  #この手の APIを使うと、プログラムミスによるリソースリークが気になる
    ところですが、Delphiの場合 VCLがとても上手く管理してくれます。(^^)

  また、const MyCursor = 1 といった定数でなく、Screen.Cursors[]内の空
  いている場所を探して、そこに curを登録するなら、以下のようなコードに
  なるでしょう。

  for j:=1 to High(TCursor) do begin
    if Screen.Cursors[j] = Screen.Cursors[crDefault] then begin
      Screen.Cursors[j] := cur;
      Form1.Cursor := j;
      Exit;  //または Break;
    end;
  end;

(ご注意)
  上記のサンプルコードでは、マウスカーソルの幅と高さが 32×32であると
  決め打ちしていますが、正しくは
  マウスカーソルの幅  = GetSystemMetrics(SM_CXCURSOR)
  マウスカーソルの高さ= GetSystemMetrics(SM_CYCURSOR)
  これで求めることができます。

Original document by Satobe          氏 ID:(JCG00336)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum