 |
Making スクリーンセーバーのソース公開
|
HOME
|
オリジナルスクリーンセーバー
|
おすすめダウンロード
|
スクリーンセーバーリンク
|
映画スクリーンセーバー
|
CMスクリーンセーバー
|
Miscrosoft Visual C++ 6.0で作成したスクリーンセーバーのソースを公開します。ここで公開しているスクリーンセーバーは、ラインをランダムに描画する簡単なものですが、これからスクリーンセーバーを作成しようとする人には参考になると思います。下の画像が実行したスクリーンセーバーの画面です。
ソースはここからダウンロードしてください!
ソースダウンロード samplescr.lzh Size:3KB
<samplescr.cppの内容>
// samplescr.cpp : アプリケーション用のエントリ ポイントの定義
//
#include "stdafx.h"
#include // MFC の標準コンポーネント
#include // MFC の拡張部分
#include // MFC の拡張部分
#include
#include
#include
#include
#include
#include
#include //コモンコントロール用
#include
#define SaverClass "SAMPLESCR.gwp"
#define SaverTitle "Screen Saver"
// 共用メモリ
HINSTANCE mainInstH; //メインインスタンスハンドル
HWND mainWinH; //メインWindowのハンドル
HWND ParentWinH;
short winBegX, winBegY; //ウィンドウの表示左上位置
short winSizX, winSizY; //ウィンドウのサイズ
short RunningMode;
// スクリーンセーバー
void Sample( HDC dcH )
{
int X1, Y1;
int X2, Y2;
int R, G, B;
HPEN NewPen, OldPen;
X1 = rand() % winSizX;
Y1 = rand() % winSizY;
X2 = rand() % winSizX;
Y2 = rand() % winSizY;
R = rand() % 256;
G = rand() % 256;
B = rand() % 256;
SetROP2( dcH, R2_XORPEN );
NewPen = CreatePen( PS_SOLID, 1, RGB( R, G, B ) );
OldPen = (HPEN)SelectObject( dcH, NewPen );
MoveToEx( dcH, X1, Y1, NULL );
LineTo( dcH, X2, Y2 );
SelectObject( dcH, OldPen );
DeleteObject( NewPen );
}
// スクリーンセーバーの動作モードを取得
BOOL SCRSAVER_GetCmdlineOption( LPSTR CmdLineStr, HWND *ParentWinH, short *RunningMode )
{
static char *Opstr[]={"-c", "-C", "/c", "/C", //設定ダイアログ
"-p", "-P", "/p", "/P", //プレビュースクリーンセーバー
"-s", "-S", "/s", "/S", //フルスクリーンセーバー
"-a", "-A", "/a", "/A",}; //パスワード変更
static short Optype[]={ 0, 0, 0, 0, //動作モードの種別
1, 1, 1, 1,
2, 2, 2, 2,
3, 3, 3, 3 };
short X;
char *Pos;
*ParentWinH = NULL;
if( 0 == lstrlen( CmdLineStr ) ) {
*RunningMode = 0;
return FALSE;
}
for( X = 0; X < 16; X ++ ) {
if ( ( Pos = strstr( CmdLineStr, Opstr[ X ] ) ) != NULL ) {
*RunningMode = Optype[ X ];
*ParentWinH = (HWND)atol( &Pos[ 2 ] );
if ( !*ParentWinH ) *ParentWinH = GetForegroundWindow();
return FALSE;
}
}
return TRUE;
}
//メインプロシージャ
LONG FAR PASCAL WindowProc( HWND winH, UINT msgID, WPARAM wParam, LPARAM lParam )
{
static UINT TimerID;
static WORD MouseMoveCtr=0;
static POINT SaveMousePos;
short X, Y;
HDC dcH;
RECT RectS;
switch(msgID){
case WM_CREATE:
mainWinH = winH;
// タイマーをセット
TimerID = SetTimer( winH, NULL, 3, NULL); // 3mmsecの割り込み
if ( 1 == RunningMode ) break;
GetCursorPos( &SaveMousePos );
ShowCursor( FALSE );
break;
case WM_ERASEBKGND:
// 背景消去
dcH = GetDC( winH );
GetClientRect ( winH, &RectS );
FillRect( dcH, &RectS, (HBRUSH)GetStockObject( BLACK_BRUSH ) );
ReleaseDC( winH, dcH );
break;
case WM_SYSCOMMAND:
// 再起動防止
return FALSE;
case WM_TIMER:
// タイマー割り込み
dcH = GetDC( mainWinH );
Sample( dcH );
ReleaseDC( mainWinH, dcH );
break;
case WM_MOUSEMOVE:
// マウスが動いた
if ( 1 == RunningMode ) break;
X = abs( SaveMousePos.x - LOWORD( lParam ) );
Y = abs( SaveMousePos.y - HIWORD( lParam ) );
if ( ( ++ MouseMoveCtr > 6 ) && ( X > 3 ) && ( Y > 3 ) ) {
// スクリーンセーバー終了
PostMessage( mainWinH, WM_CLOSE, 0, 0 );
return NULL;
}
break;
case WM_LBUTTONDOWN: // マウスの左ボタン押下
case WM_RBUTTONDOWN: // マウスの右ボタン押下
case WM_KEYDOWN: // キーボード押下
case WM_SYSKEYDOWN: // システムキーの押下
if ( 1 == RunningMode ) break;
// スクリーンセーバー終了
PostMessage( mainWinH, WM_CLOSE, 0, 0 );
return NULL;
case WM_CLOSE:
// Windowを閉じる(プレビューモード時)
DestroyWindow(winH);
break;
case WM_DESTROY:
// Windowを閉じる(終了)
// タイマーを解放する
KillTimer( winH, TimerID );
// マウスカーソルを出す
ShowCursor( TRUE );
PostQuitMessage( 0 );
return NULL;
}
return( DefWindowProc( winH, msgID, wParam, lParam) );
}
//メインウィンドウを作成
BOOL CreateMainWin( BOOL Type )
{
WNDCLASS wc;
DWORD exWinType, winStyle;
HDC dcH;
RECT RectS;
//クラスを登録
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = mainInstH;
wc.hIcon = LoadIcon( mainInstH, MAKEINTRESOURCE( IDI_APPLICATION ) );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = NULL;
wc.lpszClassName = SaverClass;
if ( NULL == RegisterClass( ( WNDCLASS * )&wc ) ) return TRUE;
if ( FALSE == Type ) {
exWinType = WS_EX_TOPMOST;
winStyle = WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
winBegX = 0;
winBegY = 0;
dcH = GetDC( NULL );
winSizX = GetDeviceCaps( dcH, HORZRES );
winSizY = GetDeviceCaps( dcH, VERTRES );
ReleaseDC( NULL, dcH );
}
else {
exWinType = NULL;
winStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
GetWindowRect( ParentWinH, &RectS );
winBegX = 0;
winBegY = 0;
winSizX = (short)( RectS.right - RectS.left );
winSizY = (short)( RectS.bottom - RectS.top );
}
//ウィンドウを生成
mainWinH=CreateWindowEx(
exWinType, //拡張情報
SaverClass, //クラス名
SaverTitle, //タイトル名
winStyle, //ウィンドウのスタイル
winBegX, //ウィンドウの水平位置(画面左上に配置)
winBegY, //ウィンドウの垂直位置(画面左上に配置)
winSizX, //ウィンドウの水平サイズ(最大)
winSizY, //ウィンドウの垂直サイズ(最大)
ParentWinH, //親ウィンドウ
NULL, //メニューハンドル
mainInstH, //インスタンスハンドル
NULL //データアドレス
);
if ( !mainWinH ) return TRUE; //ウィンドウが生成できなかった
return FALSE;
}
// メイン
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
MSG msgS;
mainInstH = hInstance;
if( FindWindow( SaverClass, NULL ) ) return NULL;
// スクリーンセーバーの動作モードを取得
if ( SCRSAVER_GetCmdlineOption( lpCmdLine, &ParentWinH, &RunningMode ) ) return NULL;
switch ( RunningMode ) {
case 0:
// 設定ダイアログ
return NULL;
case 1:
// プレビュー
if ( CreateMainWin( TRUE ) ) {
MessageBox( NULL, "Windowに失敗しました!", "初期化エラー", MB_OK|MB_SETFOREGROUND);
return NULL;
}
break;
case 2:
// フルサイズ
if ( CreateMainWin( FALSE ) ) {
MessageBox( NULL, "Windowに失敗しました!", "初期化エラー", MB_OK | MB_SETFOREGROUND );
return NULL;
}
break;
case 3:
// パスワード変更
return NULL;
}
//メッセージループ
while( GetMessage( &msgS, NULL, NULL, NULL ) ){
TranslateMessage( &msgS );
DispatchMessage( &msgS );
}
return( msgS. wParam );
}
|目次
|