Directx graphic problem

I have this code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
//Declarations and prototypes
LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
LPD3DXSPRITE d3dspt;    // the pointer to our Direct3D Sprite interface
LPDIRECT3DTEXTURE9 sprite;    // the pointer to the sprite
void initD3D(HWND hWnd);    // sets up and initializes Direct3D
void render_frame(void);    // renders a single frame
void cleanD3D(void);    // closes Direct3D and releases memory

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
	MSG msg;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = L"WindowClass1";
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    RegisterClassEx(&wc);

    HWND hWnd = CreateWindowEx(NULL,
                          L"WindowClass1",
                          L"Game",
                          WS_OVERLAPPEDWINDOW,
                          100, 100,
                          800, 600,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);
	//Initialize window and directx
    ShowWindow(hWnd, nCmdShow);
    initD3D(hWnd);

    while(TRUE)
    {
		// find out the starting time of each loop
		DWORD starting_point = GetTickCount();
		// Check to see if any messages are waiting in the queue
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			if (msg.message == WM_QUIT)
				break;
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		} 
		render_frame();
		if(KEY_DOWN(VK_ESCAPE))
            PostMessage(hWnd, WM_DESTROY, 0, 0);
		//Make the frame rate consistant
		while ((GetTickCount() - starting_point) < 25);
	} 
	//clean up DirectX and exit
    cleanD3D();
	return msg.wParam;
}

// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
        {
			PostQuitMessage(0);
            return 0;
		} break;
    }
    return DefWindowProc (hWnd, message, wParam, lParam);
}


//--------------------------------------------------------------//
//		DirectX functions:										//
//	Setup neccessary directx components and render images.		//
//--------------------------------------------------------------//

// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use
    d3dpp.Windowed = TRUE;    // program windowed, not fullscreen
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames
    d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth = SCREEN_WIDTH;
    d3dpp.BackBufferHeight = SCREEN_HEIGHT;

    // create a device class using this information and the info from the d3dpp stuct
    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);

    D3DXCreateSprite(d3ddev, &d3dspt);    // create the Direct3D Sprite object
    D3DXCreateTextureFromFile(d3ddev, L"Panel1.png", &sprite);

    return;
}


// this is the function used to render a single frame
void render_frame(void)
{
    // clear the window to a deep blue
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    d3ddev->BeginScene();    // begins the 3D scene
    d3dspt->Begin(NULL);    // begin sprite drawing

    // draw the sprite
    D3DXVECTOR3 center(0.0f, 0.0f, 0.0f);    
    D3DXVECTOR3 position(0.0f, 0.0f, 0.0f);    
    d3dspt->Draw(sprite, NULL, &center, &position, D3DCOLOR_XRGB(255, 255, 255));

    d3dspt->End();    // end sprite drawing
    d3ddev->EndScene();    // ends the 3D scene

    d3ddev->Present(NULL, NULL, NULL, NULL);

    return;
}

// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
	sprite->Release();
    d3ddev->Release();    
    d3d->Release();    
    return;
}


and an image panel1.png, that is 800 by 600 pixels, but when I run the program, only about 600 by 300 pixels of it appear
what i mean is that the 600x300 seems to take up all of what should be a 800x600 window
I believe that textures always have sizes that are powers of 2. The bitmap provided by Panel1.png is probably being stretched to fit some power-of-two size.

My guess would be that you've actually created a 1024x1024 texture, and you're viewing 800x600 of that texture (which would be more-or-less 600x300 of Panel1.png).
That sounds about right, so if I mademy image 2048*1024, and then displayed 800 * 600 of it using
SetRect(&Part, 0, 0, 799, 599);
would that display correctly.

BTW, i made it 2048*1024 because now in addition to having the 800*600 i also have extra bits that I want to display at different times
Try it and see - I bet that's the only problem. If you have different bits you want to display at different times, make them each a seperate sprite, and keep the one you want to display right now on top (for 2D sprites, the Z axis just determines what's on top, it doesn't actually position the textures further from the "camera").
Topic archived. No new replies allowed.